выберите родительский узел, содержащий текст внутри детского узла - PullRequest
5 голосов
/ 04 октября 2009

В основном я хочу выбрать узел (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

У меня есть это ниже, но, к сожалению, возвращает div вместо xpath в div.

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

Я ожидаю, / html / div / not / html / div / h1

Так есть ли способ сделать это просто с помощью синтаксиса xpath?

Ответы [ 2 ]

12 голосов
/ 04 октября 2009

Следующее выражение дает узел (div), в котором любые дочерние узлы (не только h1, b, h3) содержат указанный текст (не сам div):

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

вы можете уточнить это и вернуть только div с идентификатором contents, как в вашем примере:

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

Не совпадает, если текст является текстовым узлом div (непосредственно внутри div), что является моей интерпретацией вопроса.

7 голосов
/ 04 октября 2009

Вы можете добавить «/ ..» для привязки к родителю. Не уверен, что есть более надежный метод.

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