Python3 - Selenium 无法找到提供的 xpath

我正在使用 Python 3 和 Selenium 从网站获取一些图像链接,如下所示:


import sys

import os

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.proxy import Proxy, ProxyType


chrome_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).text

print(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?


蝴蝶不菲
浏览 220回答 4
4回答

斯蒂芬大帝

要提取src图像的属性,您需要为 引入WebDriverWait,visibility_of_element_located()您可以使用以下任一&nbsp;定位器策略:使用CSS_SELECTOR:options = webdriver.ChromeOptions()&nbsp;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()&nbsp;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')&nbsp; &nbsp; &nbsp;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 WebDriverWaitfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support import expected_conditions as EC

交互式爱情

你有正确的xpath,但不要使用绝对路径,它很容易被改变。试试这个亲戚xpath://div[@class="c-bezel programme-content__image"]//img。为了实现你的意思,请.get_attribute("src")不要使用.textdriver.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

芜湖不芜

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

12345678_0001

如果您在无头模式下工作,通常增加窗口大小是个好主意。将此行添加到您的选项中:chrome_options.add_argument('window-size=1920x1080')
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python