为了账号安全,请及时绑定邮箱和手机立即绑定

Python3 - Selenium 无法找到提供的 xpath

Python3 - Selenium 无法找到提供的 xpath

蝴蝶不菲 2022-12-27 10:12:19
我正在使用 Python 3 和 Selenium 从网站获取一些图像链接,如下所示:import sysimport osfrom selenium import webdriverfrom selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.common.proxy import Proxy, ProxyTypechrome_options = Options()  chrome_options.add_argument("--headless")driver = webdriver.Chrome(chrome_options=chrome_options)driver.get('https://www.sky.com/tv-guide/20200605/4101-1/107/Efe2-364')link_xpath = '/html/body/main/div/div[2]/div[2]/div/div/div[2]/div/div[2]/div[1]/div/div/div[2]/div/img'link_path = driver.find_element_by_xpath(link_xpath).textprint(link_path)driver.quit()解析此 URL 时,您可以在页面中间看到有问题的图像。当您在 Google Chrome 中右键单击并检查元素时,您可以在 Chrome 开发工具中右键单击该元素本身并获取此图像的 xpath。在我看来一切都井井有条,但是在运行上面的代码时出现以下错误:Traceback (most recent call last):  File "G:\folder\folder\testfilepy", line 16, in <module>    link_path = driver.find_element_by_xpath(link_xpath).text  File "G:\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath    return self.find_element(by=By.XPATH, value=xpath)  File "G:\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element    'value': value})['value']  File "G:\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute    self.error_handler.check_response(response)  File "G:\Python36\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response    raise exception_class(message, screen, stacktrace)selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/main/div/div[2]/div[2]/div/div/div[2]/div/div[2]/div[1]/div/div/div[2]/div/img"}  (Session info: headless chrome=83.0.4103.61)谁能告诉我为什么 Selenium 找不到提供的 xpath?
查看完整描述

4 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

要提取src图像的属性,您需要为 引入WebDriverWaitvisibility_of_element_located()您可以使用以下任一 定位器策略

使用CSS_SELECTOR:


options = webdriver.ChromeOptions() 

options.add_experimental_option("excludeSwitches", ["enable-automation"])

options.add_experimental_option('useAutomationExtension', False)

options.add_argument('--headless')

options.add_argument('--window-size=1920,1080')

driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')

driver.get('https://www.sky.com/tv-guide/20200605/4101-1/107/Efe2-364')

print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.o-layout__item div.c-bezel.programme-content__image>img"))).get_attribute("src"))

使用XPATH:


options = webdriver.ChromeOptions() 

options.add_experimental_option("excludeSwitches", ["enable-automation"])

options.add_experimental_option('useAutomationExtension', False)

options.add_argument('--headless')

options.add_argument('--window-size=1920,1080')

driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')

driver.get('https://www.sky.com/tv-guide/20200605/4101-1/107/Efe2-364')     

print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='o-layout__item']//div[@class='c-bezel programme-content__image']/img"))).get_attribute("src"))

控制台输出:


https://images.metadata.sky.com/pd-image/251eeec2-acb3-4733-891b-60f10f2cc28c/16-9/640

注意:您必须添加以下导入:


from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.common.by import By

from selenium.webdriver.support import expected_conditions as EC


查看完整回答
反对 回复 2022-12-27
?
交互式爱情

TA贡献1712条经验 获得超3个赞

你有正确的xpath,但不要使用绝对路径,它很容易被改变。试试这个亲戚xpath://div[@class="c-bezel programme-content__image"]//img。


为了实现你的意思,请.get_attribute("src")不要使用.text


driver.get('https://www.sky.com/tv-guide/20200605/4101-1/107/Efe2-364')

element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, '//div[@class="c-bezel programme-content__image"]//img')))

print(element.get_attribute("src"))

driver.quit()

或者更好的方法,使用 css 选择器。这应该更快:


element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, '.c-bezel.programme-content__image > img')))

参考:https ://selenium-python.readthedocs.io/locating-elements.html


查看完整回答
反对 回复 2022-12-27
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

您的 xpath 似乎是正确的。您无法定位,因为您忘记处理 cookie。自己试试吧。将驱动程序搁置几秒钟,然后单击同意所有 cookie。然后你会看到你的元素。有多种方式来处理cookie。我能够通过使用我自己的更干净的 xpath 来找到 xpath。我从最近的父母那里访问那个元素。



查看完整回答
反对 回复 2022-12-27
?
12345678_0001

TA贡献1802条经验 获得超5个赞

如果您在无头模式下工作,通常增加窗口大小是个好主意。将此行添加到您的选项中:

chrome_options.add_argument('window-size=1920x1080')


查看完整回答
反对 回复 2022-12-27
  • 4 回答
  • 0 关注
  • 219 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信