“._ElementUnicodeResult”的问题

Problems with '._ElementUnicodeResult'

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

目的是在页面上查找葡萄酒列表的原产国。所以我们开始:

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?

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

尝试将 xpath 更改为以下内容,以便 select div 元素而不是 divtext() 子节点...

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