“ ._ElementUnicodeResult”的问题

时间:2019-04-16 15:37:30

标签: xpath web-scraping html-parsing lxml xml.etree

在尝试帮助其他用户解决一些问题时,我自己遇到了以下问题:

目标是在页面上找到葡萄酒清单的原产国。所以我们开始:

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)

这是问题开始的地方。因为,如上所述,我需要找到winecountry列表的前几个元素的xpath。当我跑步时:

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 个答案:

答案 0 :(得分:2)

您正在选择text()节点而不是元素节点。这就是为什么您最终使用lxml.etree._ElementUnicodeResult类型而不是lxml.etree._Element类型的原因。

尝试将xpath更改为以下内容,以选择div元素而不是text()的{​​{1}}子节点...

div