我想从HTML页面中提取包含文本的元素,而忽略标记。例如,我要提取包含文本“ Run,Sarah,run!”的节点。来自https://en.wiktionary.org/wiki/run。我知道节点测试text()
和函数string()
。我都尝试过:
如您所见,如果我使用string()
,它将返回太多节点(结果包括包含所需节点的节点);如果我使用text()
,则将不返回任何内容(由于{{ 1}}标签。
如何找到所需的节点?
UPD::我想要所有最深的节点。这意味着,如果“维基百科”页面两次包含此句子,我想选择两个节点。
我也不知道节点类型。
答案 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!"])]'