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



我构建了一个scrapy爬网程序,用于一系列页面,这些页面以堆叠tr和td标签的重复模式保存信息。

它们的基本XPath是

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

其中CCD_ 2是用于区分要提取的每个单独字段的整数。例如,项目的名称总是在1,网站在3,电子邮件在7,依此类推,其中ContactEmail是我需要的tr标签中的最后一个,但不是范围中的最后。所以我只是使用XPath和extract方法来获取每个值,并将其添加到我的项对象中,但我发现有些页面有一个可选的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个,因此使用电子邮件标签进行识别效果不佳。

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

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

xpathtester demo

测试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

最新更新