Проблемы с '._ElementUnicodeResult' - PullRequest
1 голос
/ 16 апреля 2019

Пытаясь помочь другому пользователю с каким-либо вопросом, я сам столкнулся со следующей проблемой:

Цель - найти страну происхождения списка вин на странице. Итак, начнем с:

import requests
from lxml import etree

url = "https://www.winepeople.com.au/wines/Dry-Red/_/N-1z13zte"
res = requests.get(url)
content = res.content
res = requests.get(url)

tree = etree.fromstring(content, parser=etree.HTMLParser())
tree_struct = etree.ElementTree(tree)

Далее, по причинам, о которых я расскажу в отдельном вопросе, я пытаюсь сравнить xpath двух элементов с определенными атрибутами. Итак:

wine = tree.xpath("//div[contains(@class, 'row wine-attributes')]")
country = tree.xpath("//div/text()[contains(., 'Australia')]")

Пока все хорошо. С чем мы имеем дело?

type(wine),type(country)
>> (list, list)

Они оба списки. Давайте проверим тип первого элемента в каждом списке:

type(wine[0]),type(country[0])
>> (lxml.etree._Element, lxml.etree._ElementUnicodeResult)

И вот тут начинается проблема. Потому что, как уже упоминалось, мне нужно найти xpath первых элементов списков wine и country. И когда я бегу:

tree_struct.getpath(wine[0])

Вывод, как и ожидалось:

'/html/body/div[13]/div/div/div[2]/div[6]/div[1]/div/div/div[2]/div[2]'

Но с другим:

tree_struct.getpath(country[0])

Вывод:

TypeError: Argument 'element' has incorrect type (expected 
       lxml.etree._Element, got lxml.etree._ElementUnicodeResult)

Я не смог найти много информации о _ElementUnicodeResult), так что это? И, что более важно, как я могу исправить код, чтобы получить xpath для этого узла?

1 Ответ

2 голосов
/ 16 апреля 2019

Вы выбираете узел text() вместо узла элемента. Вот почему вы получаете тип lxml.etree._ElementUnicodeResult вместо типа lxml.etree._Element.

Попробуйте изменить свой xpath на следующий, чтобы выбрать элемент div вместо text() дочернего узла div ...

country = tree.xpath("//div[contains(., 'Australia')]")
...