XPath для поиска ячейки с определенным текстом при разборе HTML-таблиц - PullRequest
9 голосов
/ 10 марта 2012

Надеюсь, что кто-то может быстро указать мне правильное направление с моими трудностями XPath.

В настоящий момент я дошел до того, что я идентифицирую правильную таблицу, которая мне нужна в моем источнике HTML, но затем мне нужно обработать только те строки, в которых есть текст 'Chapter' где-то в DOM.

Моя последняя попытка была сделать это:

// get the correct table
HtmlTable table = page.getFirstByXPath("//table[2]");

// now the failing bit....
def rows = table.getByXPath("*/td[contains(text(),'Chapter')]") 

Я думал, что приведенный выше xpath будет означать, получите все элементы, у которых есть следующий дочерний элемент 'td', который где-то в его dom содержит текст 'Chapter'

Пример подходящей строки из моего источника:

<tr valign="top">
  <td nowrap="" align="Right">
   <font face="Verdana">
   <a href="index.cfm?a=1">Chapter 1</a>
   </font>
  </td>
  <td class="ChapterT">
    <font face="Verdana">DEFINITIONS</font>
  </td>
  <td>&nbsp;</td>
</tr>

Любая помощь / указатели очень ценятся.

Спасибо

Ответы [ 3 ]

16 голосов
/ 10 марта 2012

Используйте этот XPath:

//td[contains(., 'Chapter')]
7 голосов
/ 10 марта 2012

Вы хотите, чтобы все td с вашего текущего узла - не - все в документе , поскольку текущий принятый ответ выбирает .

Использование :

.//td[.//text()[contains(., 'Chapter')]]

Выбирает все td потомков текущего узла с именем td, у которых есть хотя бы один потомок текстового узла, чье строковое значение содержитстрока "Chapter".

Если заранее известно, что любой td по этому table имеет только один текстовый узел, это можно упростить до :

.//td[contains(., 'Chapter')]
2 голосов
/ 10 марта 2012

Вы находитесь на правильном "пути".
Функция Содержит () ограничивает определенный элемент, а не текст в любом из дочерних элементов.Попробуйте этот XPath, который вы могли бы прочитать следующим образом: - получить каждый tr / td с любым подэлементом, который содержит текст 'Chapter'

tr/td[contains(*,"Chapter")]

Удачи

...