Select 所有具有 XPath 1.0 的最深节点都包含文本,忽略标记

Select all deepest nodes with XPath 1.0 containing text, ignoring markup

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

如您所见,如果我使用 string() 它 returns 太多节点(结果包括包含我需要的节点的节点)并且如果我使用 text() 它 returns 没有(因为 <b> 标签)。

如何找到所需的节点?[​​=18=]

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

另外,我不知道节点类型。

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

//*[contains(text(), "Run, Sarah, run!")] returns 没什么,因为 "Run, Sarah, run!" 是来自多个文本节点的复合文本,而不是来自单个文本节点的复合文本

您可以使用以下内容将斜体节点与所需文本匹配:

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

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

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