python - xpath表达式 "html/body/div/text()[1]"的结果是: [object Text].它应该是使用Selenium打印元素文本的元素错误

标签 python html selenium-webdriver web-scraping xpath

我正在尝试从此示例 HTML 中提取“479”:

<div data-testid="testid">
  "479"
  " Miles Away"
</div>

我在 Python 中使用以下 Selenium 代码:​​

xpath = 'html/body/div/text()[1]'
WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.XPATH, xpath)))
distance = driver.find_element(By.XPATH, xpath)
print(distance)

返回以下错误:

'The result of the xpath expression "html/body/div/text()[1]" is: [object Text]. It should be an element.'

我尝试从 xpath 末尾删除 text()[1] ,理论上会打印出 HTML div 中包含的所有数据,但当我就是这么做的。

注意:我是一名业余爱好者并且自学成才(主要通过 Google、YouTube 和此网站),因此我的一些用词可能不正确。我提前道歉。

最佳答案

给定 html:

<div data-testid="testid">
  "479"
  " Miles Away"
</div>

文本479Miles Away都有2个不同的 text nodes .

Selenium 不支持 text(),因为它返回文本节点,如 Selenium期望返回 WebElement 。因此您会看到错误:

The result of the xpath expression "html/body/div/text()[1]" is: [object Text]. It should be an element.

解决方案

要提取文本479,您可以使用以下任一命令 locator strategies :

  • 通过execute_script()textContent使用xpath:

    print(driver.execute_script('return arguments[0].firstChild.textContent;', WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.XPATH, "//div[@data-testid='testid']")))).strip())
    
  • 通过 splitlines()get_attribute() 使用 xpath:

    print(WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.XPATH, "//div[@data-testid='testid']"))).get_attribute("innerHTML").splitlines()[1])
    

关于python - xpath表达式 "html/body/div/text()[1]"的结果是: [object Text].它应该是使用Selenium打印元素文本的元素错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75482527/

相关文章:

python BeautifulSoup 获取 div 的子项中的所有 href

html - 链接类不适用于 CSS

html - 无法在 div 中显示整个图像

java - 在缓存中找不到元素 - 也许页面在查找后已更改

selenium-webdriver - RobotFramework:拖放 Selenium2 关键字似乎不起作用

python - 如何将列定界符添加到Pandas数据框显示

python - 逆变换预测结果

python - 我可以(/是否有意义)创建一个 pandas 数据框来保存自定义类实例?

javascript - 表单内的 Accordion 自动提交

python - 如何将 HTMLUnit 驱动程序与 Python 中的 Selenium 一起使用?