基本上我想选择一个节点(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>
我期待,/ html / div / not / html / div / h1
我在下面有这个,但不幸的是返回子节点,而不是xpath到div。
expression = "//div[contains(text(), 'Child text 1')]"
doc.xpath(expression)
我期待,/ html / div / not / html / div / h1
那么有没有办法简单地使用xpath语法?
答案 0 :(得分:12)
以下表达式给出了一个节点(div),其中任何子节点(不仅仅是h1,b,h3)包含指定的文本(不是div本身):
doc.xpath('//div[.//*[contains(text(), "Child text 1")]]')
您可以对其进行优化并返回唯一一个ID为contents
的div,如下例所示:
doc.xpath('//div[@id="contents" and .//*[contains(text(), "Child text 1")]]')
它不匹配,如果文本是div的文本节点(直接在div内),这是我对问题的解释。
答案 1 :(得分:7)
你可以追加“/ ..”来锚回父母。不确定是否有更强大的方法。
expression = "//div[contains(text(), 'Child text 1')]/.."