选择包含子节点内的文本的父节点

5 ruby xpath nokogiri

基本上我想选择一个节点(div),其子节点(h1,b,h3)包含指定的文本.

<html>
<div id="contents">
<p>
<h1> Child text 1</h1>
<b> Child text 2 </b>
...
</p>
<h3> Child text 3 </h3>
</div>
Run Code Online (Sandbox Code Playgroud)

我期待,/ html/div/not/html/div/h1

我有这个,但不幸的是返回孩子,而不是xpath到div.

expression = "//div[contains(text(), 'Child text 1')]"
doc.xpath(expression)
Run Code Online (Sandbox Code Playgroud)

我期待,/ html/div/not/html/div/h1

那么有没有办法简单地使用xpath语法?

and*_*e-r 12

下面的表达式给出了一个节点(div),其中任何子节点(不仅仅是h1,b,h3)包含指定的文本(不是div本身):

doc.xpath('//div[.//*[contains(text(), "Child text 1")]]')
Run Code Online (Sandbox Code Playgroud)

您可以优化它并返回唯一具有id的div,contents如示例所示:

doc.xpath('//div[@id="contents" and .//*[contains(text(), "Child text 1")]]')
Run Code Online (Sandbox Code Playgroud)

它不匹配,如果文本是div的文本节点(直接在div内),这是我对问题的解释.


med*_*iev 7

你可以追加"/ .."来锚回父母.不确定是否有更强大的方法.

expression = "//div[contains(text(), 'Child text 1')]/.."
Run Code Online (Sandbox Code Playgroud)