选择XPath 1.0包含文本的所有最深节点,忽略标记

时间:2018-12-23 19:03:34

标签: html xpath xpath-1.0

我想从HTML页面中提取包含文本的元素,而忽略标记。例如,我要提取包含文本“ Run,Sarah,run!”的节点。来自https://en.wiktionary.org/wiki/run。我知道节点测试text()和函数string()。我都尝试过: Firefox with the console. Searching "Run, Sarah, run!"

如您所见,如果我使用string(),它将返回太多节点(结果包括包含所需节点的节点);如果我使用text(),则将不返回任何内容(由于{{ 1}}标签。

如何找到所需的节点?

UPD::我想要所有最深的节点。这意味着,如果“维基百科”页面两次包含此句子,我想选择两个节点。

我也不知道节点类型。

1 个答案:

答案 0 :(得分:2)

//*[contains(string(.), "Run, Sarah, run!")]返回包含该字符串的 all 个元素(从html节点到最后一个后代节点)。

//*[contains(text(), "Run, Sarah, run!")]不返回任何内容,因为"Run, Sarah, run!"是来自多个文本节点的复合文本,而不是来自单个文本节点的复合文本

您可以在下面使用斜体节点与所需文本进行匹配:

'//i[normalize-space()="Run, Sarah, run!"]'

如果您不想指定节点名称,可以尝试

'//*[normalize-space()="Run, Sarah, run!" and not(./*[normalize-space()="Run, Sarah, run!"])]'