7

基本上我想选择一个节点(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/ 不是 /html/div/h1

我在下面有这个,但不幸的是返回了孩子,而不是 div 的 xpath。

expression = "//div[contains(text(), 'Child text 1')]"
doc.xpath(expression)

我期待,/html/div/ 不是 /html/div/h1

那么有没有办法简单地使用 xpath 语法来做到这一点?

4

2 回答 2

15

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

doc.xpath('//div[.//*[contains(text(), "Child text 1")]]')

您可以对其进行细化并返回唯一具有 id 的 div,contents如您的示例中所示:

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

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

于 2009-10-04T08:29:08.317 回答
10

您可以附加“/..”以锚定回父级。不确定是否有更强大的方法。

expression = "//div[contains(text(), 'Child text 1')]/.."
于 2009-10-03T22:52:14.317 回答