无法使用 Python Selenium 获取元素 find_element(By.CSS_SELECTOR)

Can't get element with Python Selenium find_element(By.CSS_SELECTOR)

提问人:Eric Lehmann 提问时间:9/12/2023 最后编辑:ShawnEric Lehmann 更新时间:9/12/2023 访问量:60

问:

我无法在要抓取的页面中获取特定元素。内容被包裹在一个奇怪的标签中,不确定它是否是 iframe。我也尝试过CSS_SELECTOR,但是在上述标签之后出现的任何内容都会引发错误。

我要抓取的页面:https://connect.echobotsales.de/#/company/YwOwE8kYmN

我在做什么:

try:
    telephone_element = driver.find_element(By.XPATH, "//dynamicelements/div[2]/div[2]/div[2]/div[2]/span/a").text
    print(telephone_element)
except Exception as e:
    print("error", e)

我收到的错误:

error Message: no such element: Unable to locate element: {"method":"xpath","selector":"//dynamicelements/div[2]/div[2]/div[2]/div[2]/span/a"}
  (Session info: headless chrome=113.0.5672.63); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception
python selenium-webdriver 网页抓取 xpath css 选择器

评论

0赞 Siebe Jongebloed 9/12/2023
XPath 是正确的。可能是dynamicelements-element导致了问题。它不是html元素...?是什么给了你这个XPath:?//span[@ng-if='!company.phoneIsBlacklisted']/a
0赞 Eric Lehmann 9/12/2023
相同的错误堆栈跟踪。我认为确实是dynamiceleents元素是问题所在。该标记之前的任何元素都可以拾取。
0赞 Siebe Jongebloed 9/12/2023
如果您使用 : span[ng-if='!company.phoneIsBlacklisted'] >css selecter
0赞 Eric Lehmann 9/12/2023
我使用了:company_phone = driver.find_element(By.CSS_SELECTOR, “span[ng-if='!company.phoneIsBlacklisted'] > a”) 错误消息:没有这样的元素:无法找到元素:{“method”:“xpath”,“selector”:“//span[@ng-if='!company.phoneIsBlacklisted']/a”}

答:

1赞 qatesterbecomingprogrammer 9/12/2023 #1

虽然我使用了您提供的 Xpath,但它向我显示了确切的电话号码。表示您的 xpath 是有效的。 您可以先使用 wait 与该元素进行交互。人们只使用一个等待,但我使用 2 个安全方面,使用 2 个等待来确保该元素很有吸引力。

因此,您可以使用以下方法:

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

    telephone_xpath = "//dynamicelements/div[2]/div[2]/div[2]/div[2]/span/a"
    wait = WebDriverWait(driver, 10)
    wait.until(
            EC.presence_of_element_located((By.XPATH, telephone_xpath))
    wait.until(
            EC.element_to_be_clickable((By.XPATH, telephone_xpath))
    try:
        
        telephone_element = driver.find_element(By.XPATH, telephone_xpath).text
        print(telephone_element)
    except Exception as e:
        print("error", e)

希望这对你有所帮助。 您可以从屏幕截图中查看它。enter image description here

评论

0赞 Eric Lehmann 9/12/2023
嗯。。。仍然收到此错误,我相信当它找不到元素时会发生这种情况?错误消息:堆栈跟踪:#0 0x55a6ff9e2133 <未知> #1 0x55a6ff716966 <未知> #2 0x55a6ff7530dc <未知> .....#18 0x7f78ff4bf402 <未知>
0赞 qatesterbecomingprogrammer 9/12/2023
我运行了代码,它从打印报表中给了我电话号码。
0赞 Eric Lehmann 9/13/2023
谢谢,它最终奏效了。感谢您抽出宝贵时间解释!
1赞 Shawn 9/12/2023 #2

检查下面的代码:

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

driver = webdriver.Chrome()
driver.get("https://connect.echobotsales.de/#/company/YwOwE8kYmN")

wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//dynamicelements/div[2]/div[2]/div[2]/div[2]/span/a")))
print(element.text)
print(element.get_attribute("innerText"))

控制台输出:

+49 89996400
+49 89996400

Process finished with exit code 0

另一种选择:虽然上面使用的 XPath 表达式是正确的,但您也可以尝试使用下面的 XPath 表达式来查找所需的元素。请参阅以下代码行:

element = wait.until(EC.element_to_be_clickable((By.XPATH, "//span//a[contains(@href,'tel')]")))

评论

0赞 Eric Lehmann 9/13/2023
谢谢,它工作得很好。感谢您抽出宝贵时间:)