Python Selenium 搜索只有文本的 sebbling [object Text]

Python Selenium search for sibbling [object Text] that only have a text

提问人:Freddy André Cuellar López 提问时间:1/24/2023 更新时间:1/24/2023 访问量:61

问:

我想在 xpath 中获取一个表达式的文本,该表达式在其同级html_code中只有文本

我正在尝试这种方式,但它给了我一个错误,我不知道如何选择文本,因为它没有任何标签


driver.find_element('xpath','//li[@class="icon-feature"]//i[@class="icon-stotal"]//following-sibling::text()').text

错误:

InvalidSelectorException: invalid selector: The result of the xpath expression "//li[@class="icon-feature"]//i[@class="icon-stotal"]//following-sibling::text()" is: [object Text]. It should be an element.

我只想有“ 121 m2 总计”。

对此的任何帮助都是值得赞赏的。

python selenium 网页抓取 xpath html 解析

评论


答:

0赞 undetected Selenium 1/24/2023 #1

find_element() 返回一个 WebElement,它不能返回一个 Text Node。所以你不能使用:

//xpath_expression/text()

因此出现错误:

InvalidSelectorException: invalid selector

溶液

文本 121 m2 Total 位于文本节点内,并且 的减值值为 。因此,要提取文本,您需要诱导 WebDriverWait 获取 visibility_of_element_located(),并且可以使用以下任一定位器策略<i class="icon-stotal">

  • 使用 XPATHtext 属性:

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//li[@class='icon-feature']/i[@class='icon-stotal']"))).text)
    
  • 使用 XPATH 和 :get_attribute("textContent")

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//li[@class='icon-feature']/i[@class='icon-stotal']"))).get_attribute("textContent"))
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

您可以在如何使用 Selenium 检索 WebElement 的文本 - Python 中找到相关讨论

评论

0赞 Freddy André Cuellar López 1/24/2023
那么,如何将其从文本节点转换为WebElement?,我尝试将这样的东西: '//li[@class=“icon-feature”]//i[@class=“icon-stotal”]//following-sibling::*' 但它不起作用
0赞 undetected Selenium 1/24/2023
您是否碰巧检查了针对您的问题发布的答案
0赞 Freddy André Cuellar López 1/24/2023
这就是问题所在,121 m2 Total 不是 <i class=“icon-stotal”的 decesdent>是它的兄弟姐妹。链接
0赞 sound wave 1/24/2023 #2

find_element必须返回 WebElement,并且不能将文本节点转换为 WebElement。

通常,若要获取未包含在任何标记中的文本,必须获取父项的文本并从中删除子项的文本。在这种情况下,只有一个孩子,所以

child  = driver.find_element(By.XPATH, "//i[@class='icon-stotal']")
parent = driver.find_element(By.XPATH, "//i[@class='icon-stotal']/parent::li")

然后

>>> parent.text.replace(child.text,'')
' 121 m total'