XPath定位包含特定文本的单元格在HTML表中解析

11

希望有人能够迅速指导我在XPath方面的困难。

目前,我已经确定了我需要在HTML源代码中使用的正确表格,但是我需要处理仅包含“Chapter”文本的行。

我最后一次尝试是这样做的:

// 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个回答

20

使用此XPath:

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

谢谢,它似乎可以工作。'.' 代表什么?另外我不明白为什么 'reletive' 检测不起作用,例如,你有 // 这意味着从根目录开始,这是我的理解? - David Brown
1
@Dave,不用谢。.//是XPath的缩写语法。.选择上下文节点。//td选择文档根节点的所有td后代,因此选择与上下文节点在同一文档中的所有td元素。参考资料: http://www.w3.org/TR/xpath/#path-abbrev - Kirill Polishchuk

9

您希望在当前节点下找到所有的 td -- 不是 - 文档中的所有 就像当前接受的答案选择的那样。

使用方法:

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

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

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

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

2

你在正确的“路径”上。
contains()函数仅限于特定元素,而不是任何子元素中的文本。尝试使用以下XPath,您可以按如下方式阅读: - 获取包含文本“Chapter”的任何子元素的每个tr / td

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

祝你好运


嗨,William,我尝试过了,但无法返回任何内容。虽然不太有效率,但可行的方法是单行代码:'def chapterAnchors = page.anchors.findAll {HtmlAnchor a -> a.asText().contains('Chapter')}'。 - David Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接