Я пытаюсь найти все секунды tds среди потомков div с указанным id, т.е. 22 и 222. Первое решение, которое приходит мне в голову, было:
//div[@id='indicator']//td[2]
но он выбирает только первую ячейку таблицы, т. е. 22, но не одновременно 22 и 222. Затем я заменил // на /descendant-or-self::node()/ и получил тот же результат (очевидно). Но когда я удалил «-или-я», выражение 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 или нет.
.//div[@id='indicator']//tr/td[2]
, и оно дает правильные результаты[u'<td>22</td>', u'<td>222</td>']
- person William Kinaan   schedule 29.07.2015