XPath用于定位具有解析HTML表的特定文本的单元格

时间:2012-03-10 03:48:17

标签: xml xpath groovy htmlunit

希望有人能在我的XPath困难中快速指出正确的方向。

当前我已经到了我在HTML源代码中识别正确表格的地步,但后来我只需要处理在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 个答案:

答案 0 :(得分:16)

使用此XPath:

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

答案 1 :(得分:7)

您希望当前节点下的所有td - - 全部在文档 中,因为当前接受的答案选择

使用

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

这将选择当前节点的所有td个后代,这些后代名为td,至少有一个文本节点后代,其字符串值包含字符串"Chapter"

如果事先知道此td下的任何table只有一个文字节点,则可以简化为

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

答案 2 :(得分:2)

你在正确的“道路上”。
contains()函数限制特定元素,而不限于任何子元素中的文本。试试这个XPath,您可以阅读如下: - 使用包含文本“Chapter”

的任何子元素获取每个tr / td
tr/td[contains(*,"Chapter")]
祝你好运