【问题标题】:Selenium Timeout Exception in PythonPython 中的 Selenium 超时异常
【发布时间】:2021-02-15 19:27:54
【问题描述】:

我有以下功能:

def get_info(url):
    options = webdriver.ChromeOptions()
    options.headless = True
    chrome_browser = webdriver.Chrome('./chromedriver', chrome_options=options)
    chrome_browser.get(url)
    name = chrome_browser.find_element_by_xpath("//h1[contains(@class,'text-center medium-text-left')]").text
    winter = WebDriverWait(chrome_browser, 10).until(
        EC.presence_of_element_located((By.XPATH, '//*[@id="main-content"]/div[1]/div[1]/div/div[2]/div[5]/div['
                                                  '2]/div/div[1]/div[3]/div')))
    chrome_browser.quit()
    return winter, name

我想从这个网站上的冬/春/夏等图表中获取宽度百分比:https://www.fragrantica.com/perfume/Christian-Dior/Sauvage-Eau-de-Parfum-48100.html

所以我希望这个函数在 HTML 页面上返回香水的名称和冬季行。 季节收视率在网站上加载似乎有点慢,所以我尝试添加等到 HTML 行出现。 当我点击冬季收视率图表上的检查时,我得到了这个元素:

<div style="border-radius: 0.2rem; height: 0.3rem; background: rgb(120, 214, 240); width: 90.3491%; opacity: 1;"></div>

首先,BeautifulSoup 没有找到它,所以我尝试了 Selenium。 Selenium 没有找到它,当使用 WebDriverWait 时,它只会显示这个错误:

Traceback (most recent call last):
  File "D:/Fragrance selector/main.py", line 16, in <module>
    s = info.get_info('https://www.fragrantica.com/perfume/Christian-Dior/Sauvage-Eau-de-Parfum-48100.html')
  File "D:\Fragrance selector\fragrance_info_from_net.py", line 24, in get_info
    winter = WebDriverWait(chrome_browser, 10).until(
  File "D:\Fragrance selector\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 

我真的对这个问题没有想法。我对如何从收视率中获得宽度百分比没有更多的想法。如果你们中的一些人能帮助我解决这个问题,我将不胜感激。

【问题讨论】:

  • 也许在浏览器中加载页面,将其保存到文件中,看看是否可以在 BeautifulSoup4 中使用相同的逻辑。这可能就像 XPath 错误一样简单。另外,使用try ... except 语句来尝试您的WebDriverWait,这样您就可以在程序中发生异常时处理它。

标签: python html selenium web-scraping


【解决方案1】:

我将 WebDriverWait 中的等待时间修改为 30 秒,并添加了一个 get_attribute 以返回正确的数据。请参阅下面的示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.support.wait import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--no-sandbox')
options.add_argument('--start-maximized')
options.add_argument('--disable-extensions')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--ignore-certificate-errors')
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
driver.get('https://www.fragrantica.com/perfume/Christian-Dior/Sauvage-Eau-de-Parfum-48100.html')
name = driver.find_element(By.XPATH, "//h1[contains(@class,'text-center medium-text-left')]").text
winter = WebDriverWait(driver, 30).until(ec.presence_of_element_located((By.XPATH, '//*[@id="main-content"]/div[1]/div[1]/div/div[2]/div[4]/div[2]/div/div[1]/div[3]/div/div')))
t = winter.get_attribute('style')
driver.quit()

要将所有评分(面孔和季节)放入列表中,请使用以下代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.support.wait import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

new = []
options = Options()
options.add_argument('--no-sandbox')
options.add_argument('--start-maximized')
options.add_argument('--disable-extensions')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--ignore-certificate-errors')
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
driver.get('https://www.fragrantica.com/perfume/Christian-Dior/Sauvage-Eau-de-Parfum-48100.html')
name = driver.find_element(By.XPATH, "//h1[contains(@class,'text-center medium-text-left')]").text
WebDriverWait(driver, 30).until(ec.presence_of_element_located((By.XPATH, '//*[@id="main-content"]/div[1]/div[1]/div/div[2]/div[4]/div[2]/div/div[1]/div[3]/div/div')))
ratings = driver.find_elements(By.XPATH, './/div[@style="width: 100%; height: 0.3rem; border-radius: 0.2rem; background: rgba(204, 224, 239, 0.4);"]')
for style in ratings:
    new.append(style.find_element(By.TAG_NAME, 'div').get_attribute('style'))


print(new)
driver.quit()

这将给出条形显示的百分比的有序列表(从面孔开始,然后移动到季节)。

【讨论】:

  • 所以我尝试复制粘贴您的解决方案,但出现此错误: driver = webdriver.Chrome(service=service, options=options) TypeError: __init__() got an unexpected keyword argument 'service'
  • 好的,所以我从 ChromeDriver 管理器中删除了服务,它现在似乎可以工作了。谢谢
  • 嘿,因为我想得到我在冬天之后添加的所有季节:spring = WebDriverWait(driver, 30).until(ec.presence_of_element_located((By.XPATH, )))。但我得到一个 selenium.common.exceptions.TimeoutException。你知道如何解决这个问题吗?
  • @Alexandru-GabrielBadea 查看我编辑的答案。
  • 先生,您是救世主。非常感谢。我从你的回答中学到了很多。
猜你喜欢
  • 2021-02-25
  • 1970-01-01
  • 2016-07-01
  • 2021-03-31
  • 2017-04-19
  • 2020-12-16
  • 1970-01-01
  • 2022-11-19
相关资源
最近更新 更多