Следующий брат в xpath не работает как задумано - PullRequest
2 голосов
/ 24 июня 2019

Я пытался вычеркнуть часть текста из некоторых HTML-элементов с помощью xapth, но, похоже, я что-то не так, поэтому я не могу это сделать.

HTML-элементы:

htmlelem = """
<div class="content">
    <p>Type of cuisine: </p>International
</div>
"""

Я бы хотел выкопать International, используя xpath.Я знаю, что могу добиться успеха, используя .next_sibling Если я хочу извлечь то же самое, используя css selector, но мне не интересно идти по этому пути.

Тем не менее, если я попытаюсь таким образом, я могу получить то же самоеиспользуя xpath:

tree.xpath("//*[@class='content']/p/following::text()")[0]

Но вышеприведенное выражение - не то, что мне нужно, потому что я не могу использовать то же самое в веб-драйвере selenium, если я придерживаюсь driver.find_element_by_xpath()

Единственный способ, которым меня интересует, - это, как показано ниже, но он не работает:

"//*[@class='content']/p/following::*"

Пример из реальной жизни:

from lxml.html import fromstring

htmlelem = """
<div class="content">
    <p>Type of cuisine: </p>International
</div>
"""
tree = fromstring(htmlelem)
item = tree.xpath("//*[@class='content']/p/following::text()")[0].strip()
elem = tree.xpath("//*[@class='content']/p/following::*")[0].text
print(elem)

В приведенном выше примере я могу добиться успехапечать item, но не может печатать elem.Однако я бы хотел изменить выражение, используемое в elem.

Как я могу заставить его работать так, чтобы тот же xpath я мог использовать в библиотеке lxml или вselenium

1 Ответ

2 голосов
/ 24 июня 2019

Поскольку OP искал решение, которое извлекает текст извне xpath, следующее должно сделать это, хотя и несколько неловко:

tree.xpath("//*[@class='content']")[0][0].tail

Вывод:

Международный

Необходимость такого подхода является результатом того, что lxml анализирует HTML-код: tree.xpath("//*[@class='content']") приводит к list длины = 1.Первый (и единственный) элемент в списке - tree.xpath("//*[@class='content']")[0] - это lxml.html.HtmlElement, который сам по себе может рассматриваться как список, а также имеет длину = 1.

В tail первого (итолько) элемент в этом lxml.html.HtmlElement скрывает желаемый вывод ...

...