【发布时间】:2015-07-29 08:51:28
【问题描述】:
我尝试在具有指定 id 的 div 的后代中查找所有秒 tds,即 22 和 222。我想到的第一个解决方案是:
//div[@id='indicator']//td[2]
但它只选择第一个表格单元格,即 22,但不会同时选择 22 和 222。 然后我用 /descendant-or-self::node()/ 替换了 // 并得到了相同的结果(显然)。但是当我删除“-or-self”时,xpath 表达式开始按预期工作
test1 = test_tree.xpath(u"//div[@id='indicator']/descendant-or-self::node()/td[2]")
print len(test1) #prints 1 (first one: 22)
test1 = test_tree.xpath(u"//div[@id='indicator']/descendant::node()/td[2]")
print len(test1) #prints 2 (22 and 222)
这里是测试 HTML
<html>
<body>
<div id='indicator'>
<table>
<tbody>
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
</tr>
<tr>
<td>11</td>
<td>22</td>
<td>33</td>
</tr>
<tr>
<td>111</td>
<td>222</td>
<td>333</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
我想知道为什么两个表达式的工作方式不同,因为所有 td 都是 div 元素的后代,无论是否包含 div。
【问题讨论】:
-
xpath 测试仪上的所有三个 xpath 在输出中给出 2 个元素
-
全部返回2个元素:i.imgur.com/32WRNHs.png
-
哈哈。这是我的输出。完全相同的代码,但结果不同imgur.com/fZCL6nH
-
另一个注意事项:Selenium IDE 也仅突出显示第一个 td[2] 而 Firebug 的 FireFinder 扩展同时显示这两个 :(
-
我在本地服务器上复制了您的示例,其 HTML 页面包含您的 HTML 示例。我使用的是scrapy,所以我的选择器是LXML Xpath 选择器。我使用了这个 xpath 值
.//div[@id='indicator']//tr/td[2],它给了我正确的结果[u'<td>22</td>', u'<td>222</td>']
标签: python-2.7 xpath lxml descendant descendant-or-self