我构建了一个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号,所以使用用于识别的电子邮件标签效果不佳。
答案 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