【问题标题】:Issue with Python Selenium using `find_element_by_xpath(xpath)`使用`find_element_by_xpath(xpath)`的Python Selenium问题
【发布时间】: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,但我不需要,我需要关闭&lt;/strong&gt;标签之后的数据。

文本“地址:”的 xpath 可能类似于:

/html/body/div[2]/div[4]/div[1]/span/strong[2]

那么在结束 &lt;/strong&gt; 标记之后的文本的 xpath 是什么,它将给我直到下一个起始 &lt;strong&gt; 标记之前的所有内容?


更新:

我确定以下是 &lt;strong&gt;&lt;/strong&gt; 标记后文本的正确 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


【解决方案1】:

试试这样的:

acme = """
<span>
  <strong>Address:</strong>
24 some street, CA
<strong>Company:</strong>
ACME Inc. 
</span>
"""
import lxml.html

doc = lxml.html.fromstring(acme)
street = doc.xpath('//span/strong[1]/following-sibling::text()[1]')
print(street[0].strip())

加利福尼亚州某街 24 号

输出:

【讨论】:

  • 这使用 lxml.html 工作,提供的 xpath 在另一个答案中是相同的,但是 Selenium 具有开发人员在该项目中输入的特定代码,以拒绝提供 TEXT 的 xpath。但我不明白的是,我认为(或者更确切地说,它已记录在案)HTML 的字节表示需要传递给:lxml.html.fromstring(html_bytes) 而不是 HTML 字符串表示,但我将字符串表示传递给fromstring(html_text) 通过 Selenium 使用:self.webdriver.page_source 这是文本,它可以工作。我不明白它为什么会起作用,
【解决方案2】:

你需要使用兄弟姐妹。像这样的

find_element_by_xpath(//strong/following-sibling::text()[1])

【讨论】:

  • 好的,我试试看。使用什么工具来生成 XPATH?我一直在使用 Firefox(选择右键复制 XPATH)和 Chrome 插件,两者都不会提供该 xpath,如果我能正常工作,我会发布,谢谢!
  • 我确定这是正确的 xpath,但它不适用于 Selenium,`find_element_by_xpath),我在原始问题的底部发布了更新,但感谢您的帮助。跨度>
猜你喜欢
  • 2021-05-17
  • 1970-01-01
  • 2022-11-18
  • 2017-11-17
  • 2012-09-08
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多