在尝试帮助其他用户解决一些问题时,我自己遇到了以下问题:
目标是在页面上找到葡萄酒清单的原产国。所以我们开始:
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)
这是问题开始的地方。因为,如上所述,我需要找到wine
和country
列表的前几个元素的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?
答案 0 :(得分:2)
您正在选择text()
节点而不是元素节点。这就是为什么您最终使用lxml.etree._ElementUnicodeResult
类型而不是lxml.etree._Element
类型的原因。
尝试将xpath更改为以下内容,以选择div
元素而不是text()
的{{1}}子节点...
div