Проблемы с созданием xpath, чтобы иметь возможность определять элементы условно - PullRequest
0 голосов
/ 15 декабря 2018

Я пытался создать xpath, который должен был найти первые три Yes внутри p элементов до тех пор, пока текст Demarcation не будет внутри h1 элементов.Существующий, который я использовал в скрипте ниже, размещает весь текст в элементах p.Тем не менее, я не могу найти ни одной идеи, чтобы двигаться дальше.Просто рассмотрите тот, который я уже создал, как заполнитель.

Как я могу создать xapth, чтобы иметь возможность найти первые три Yes в элементах p и ничего больше?

Моя попытка до сих пор:

from lxml.html import fromstring

htmldoc="""
<li>
    <a>Nope</a>
    <a>Nope</a>
    <p>Yes</p>
    <p>Yes</p>
    <p>Yes</p>
    <h1>Demarcation</h1>
    <p>No</p>
    <p>No</p>
    <h1>Not this</h2>
    <p>No</p>
    <p>Not this</p>
</li>
"""
root = fromstring(htmldoc)
for item in root.xpath("//li/p"):
    print(item.text)

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Похоже, вы пытаетесь зависеть от тега h1, содержащего Demarcation, поэтому начните с него:

//h1[contains(., "Demarcation")]/preceding-sibling::p[contains(., "Yes")][position()<4]

Идея состоит в том, чтобы получить предыдущие элементы p, и я добавилposition()<4 так что вы получите только три, вы можете удалить это, если вам просто нужны все p:

//h1[contains(., "Demarcation")]/preceding-sibling::p[contains(., "Yes")]
0 голосов
/ 15 декабря 2018

Попробуйте ниже выбрать абзацы, которые предшествуют братьям и сестрам заголовка "Demarcation"

//li/p[following-sibling::h1[.="Demarcation"]]
...