【发布时间】:2020-03-19 18:41:39
【问题描述】:
我正在使用 Python Selenium 尝试抓取或获取数据,因为 lxml 在解析 HTML 和使用 xpath 获取数据方面的文档记录非常差,而且无论我尝试什么,该库都无法使用。
我在 Selenium 方面取得了一些成功:(但并非总是如此——因此这个问题)
element = self.driver.find_element_by_xpath(xpath)
print(element.text)
问题:
如果我在 HTML 文档中有这样的 HTML 段:
<strong>Address:</strong>
24 some street, CA
<strong>Company:</strong>
ACME Inc.
我使用 Firefox 来获取数据的 xpath,或者使用 Chrome 插件来获取“24 some street, CA”的 xpath,但我无法获得它(两者都没有给我数据的 xpath)。
我只能获取'Address:'的xpath,但我不需要,我需要关闭</strong>标签之后的数据。
文本“地址:”的 xpath 可能类似于:
/html/body/div[2]/div[4]/div[1]/span/strong[2]
那么在结束 </strong> 标记之后的文本的 xpath 是什么,它将给我直到下一个起始 <strong> 标记之前的所有内容?
更新:
我确定以下是 <strong></strong> 标记后文本的正确 xpath,但 Selenium 不喜欢它。
当我将它与 Selenium 与以下 xpath 一起使用时,它会失败
xpath_wo_num = '/html/body/div[2]/div[4]/div[1]/span/strong[1]/following-sibling::text()[1]'
element = self.driver.find_element_by_xpath(xpath_wo_num)
Selenium 的开发人员添加了特定的代码,该代码会拒绝正确的 xpath,因为它返回 TEXT。
我收到此错误消息:
Message: invalid selector:
The result of the xpath expression "/html/body/div[2]/div[4]/div[1]/span/strong[1]/following-sibling::text()[1]" is: [object Text].
It should be an element.
(Session info: headless chrome=80.0.3987.132)
【问题讨论】:
-
如果您可以添加更多 HTML 代码,那将会有所帮助。尝试在您拥有此内容的地方发布更大的 html 部分。
-
selenium 显示的错误非常清楚,不能使用 xpath 选择文本,它应该是元素而不是文本。在您的 xpath 中,您使用完整的 xpath 来提取文本,但在问题中只有部分 HTML,您可以构建 xpath 以获取文本所在的父元素,而不是像 stackoverflow.com/questions/54568588/… 那样提取相对于它的文本。虽然使用相对 xpath 而不是元素的完整 xpath 很好。
标签: python selenium xpath lxml lxml.html