Scrapy:为只出现在某些页面中的项修改Xpath

2024-06-08 19:15:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我构建了一个scrapy爬虫,并为一系列页面构建了一个爬虫,这些页面以一种重复的模式保存它们的信息,即堆叠tr和td标记。你知道吗

它们的基本XPath是

/div/table/tr[5]/td/table/tr/td/table[1]/tr[/*number*/]/td[2]/strong/text()

其中/*number*/是一个整数,用于区分要提取的每个单独字段。例如,项目的名称始终为1,网站为3,电子邮件为7,以此类推,ContactEmail是我需要的tr标记的最后一个-但不是范围内的最后一个。因此,我只是使用带有extract方法的XPath来获取每个值并将其添加到我的item对象中——但是我发现有些页面有一个可选的ContactPosition字段,它只出现在某些项中,并且总是在ContactEmail之前的索引中。在我看到的例子中,ContactEmail在所有情况下都会在索引13处,除了那些有ContactPosition值的情况,在那里它会被移动到索引14。你知道吗

有没有什么方法可以检查有多少tr标记,这样我就可以使用if-else来分配正确的索引号并避免索引越界异常?你知道吗

@tdelaney公司:

页面上的标签都是这样读的。你知道吗

                <tr>
                    <td class="cont_1col_txt_cuerpo">Position:</td>
                    <td class="cont_1col_txt_cuerpo"><strong>General Manager</strong></td>
                </tr>

                <tr>
                    <td class="cont_1col_txt_cuerpo">Email:</td>
                    <td class="cont_1col_txt_cuerpo"><strong>samir@philka.com</strong></td>
                </tr>

我想这么做但是 1) ContactPosition标签在没有CP的页面中会丢失,所以使用它不会产生错误吗? 2) 每个页面都有两封电子邮件,但两封电子邮件的标签都是相同的,它们之间唯一的区别是,一封固定在第5个tr标签上,另一封(我称之为ContactEmail)可能在13号或14号,因此使用email标签进行识别不会很好。你知道吗


Tags: 标记txttable页面标签xpathtr爬虫
1条回答
网友
1楼 · 发布于 2024-06-08 19:15:00

您可以使用(your/xpath/here)[last()]模式来获取整个XML文档的最后一个匹配元素。将其与注释中的@tdelaney所建议的结合起来,即通过第一个td元素的内容来标识目标tr,您将得到如下结果:

(//table/tr[td='Email:']/td[2]/text())[last()]

^{}

测试XML:

<table> 
  <tr> 
    <td class="cont_1col_txt_cuerpo">Email:</td>  
    <td class="cont_1col_txt_cuerpo">
      <strong>someotheremail@gmail.com</strong>
    </td> 
  </tr> 
  <tr> 
    <td class="cont_1col_txt_cuerpo">Position:</td>  
    <td class="cont_1col_txt_cuerpo">
      <strong>General Manager</strong>
    </td> 
  </tr>  
  <tr> 
    <td class="cont_1col_txt_cuerpo">Email:</td>  
    <td class="cont_1col_txt_cuerpo">
      <strong>samir@philka.com</strong>
    </td> 
  </tr> 
</table>

输出:

samir@philka.com

相关问题 更多 >