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

时间:2015-12-12 07:46:29

标签: python xpath scrapy

我构建了一个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标签 - 但不是范围中的最后一个。所以我只是使用带有提取方法的XPath来获取每个值并将其添加到我的项目对象中 - 但我发现有些页面有一个可选的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)没有CP的页面中会丢失ContactPosition标记,因此不会使用它会产生错误吗? 2)每个页面都有两封电子邮件,但两封电子邮件的标签是相同的,它们之间唯一的区别是一个固定在第5个tr标签而另一个(我称之为ContactEmail)可以在13或14号,所以使用用于识别的电子邮件标签效果不佳。

1 个答案:

答案 0 :(得分:0)

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

(//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