【问题标题】:WebDriverWait on finding element by CSS SelectorWebDriverWait 通过 CSS 选择器查找元素
【发布时间】:2019-04-30 19:48:24
【问题描述】:

我想使用 Python 3 检索此网页的航班价格:https://www.google.es/flights?lite=0#flt=/m/0h3tv./m/04jpl.2018-12-17;c:EUR;e:1;a:FR;sd:1;t:f;tt:o

起初我遇到了一个错误,几个小时后我意识到这是因为我没有给 webdriver 足够的时间来加载所有元素。因此,为了确保它有足够的时间,我添加了一个 time.sleep,如下所示:

time.sleep(1)

这使它起作用了!但是,我已阅读并被建议不要使用此解决方案,而是使用 WebDriverWait。因此,经过几个小时和几个教程后,我坚持试图找出 WebDriverWait 应该等待的确切 CSS 类。

我认为最接近的是:

WebDriverWait(d, 1).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".flt-subhead1.gws-flights-results__price.gws-flights-results__cheapest-price")))

关于我缺少什么的任何想法?

【问题讨论】:

    标签: python css python-3.x selenium web-scraping


    【解决方案1】:

    您可以使用 css attribute = value 选择器来定位,或者如果该值是动态的,您可以使用 css 选择器组合来进行位置匹配。

    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://www.google.es/flights?lite=0#flt=/m/0h3tv./m/04jpl.2018-12-17;c:EUR;e:1;a:FR;sd:1;t:f;tt:o")
    
    #element = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CSS_SELECTOR , '[jstcache="9322"]')))
    element = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CSS_SELECTOR , '.flt-subhead1.gws-flights-results__price.gws-flights-results__cheapest-price span + jsl')))
    print(element.text)
    #driver.quit()
    

    无结果案例:

    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
    from selenium.common.exceptions import TimeoutException
    
    driver = webdriver.Chrome()
    url ="https://www.google.es/flights?lite=0#flt=/m/0h3tv./m/04jpl.2018-12-17;c:EUR;e:1;a:FR;sd:1;t:f;tt:o"  #"https://www.google.es/flights?lite=0#flt=/m/0h3tv./m/04jpl.2018-11-28;c:EUR;e:1;a:FR;sd:1;t:f;tt:o"
    driver.get(url)
    
    try:
        status = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CSS_SELECTOR , 'p[role=status')))
        print(status.text)
    except TimeoutException as e:
        element = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CSS_SELECTOR , '.flt-subhead1.gws-flights-results__price.gws-flights-results__cheapest-price span + jsl')))
        print(element.text)
    #driver.quit()
    

    【讨论】:

    • 嗨 QHarr,jstcache 值不是动态生成的,因此会随着时间而变化吗?
    • element = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CSS_SELECTOR , '.flt-subhead1.gws-flights-results__price.gws-flights-results__cheapest-price span + jsl ')))
    • 收到此错误:“selenium.common.exceptions.TimeoutException: Message:”所以可能找不到元素
    • 将等待时间增加到 10? element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR , '.flt-subhead1.gws-flights-results__price.gws-flights-results__cheapest-price span + jsl')))
    • 是的,我的错。事情是我通过一个while循环运行链接以获得全年的结果,我不小心发布了下个月一天的链接,而不是我今天使用的链接。感谢您的帮助,我也接受了您的其他答案。
    【解决方案2】:

    我可能是错的,但我认为您正在尝试获取航班旅行的价格。

    如果我的假设是正确的,请看看我的方法。我找到搜索结果列表,然后是搜索结果列表中的所有行程,循环并获取所有价格信息。这是我能想到并避免所有动态属性的最佳方法

    from selenium.webdriver import Chrome
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait 
    from selenium.webdriver.support import expected_conditions as EC
    
    wait = 20
    
    driver = Chrome()
    driver.get("https://www.google.es/flights?lite=0#flt=/m/0h3tv./m/04jpl.2018-12-17;c:EUR;e:1;a:FR;sd:1;t:f;tt:o")
    
    # Get the Search Result List
    search_results= WebDriverWait(driver, wait).until(EC.presence_of_element_located((By.CSS_SELECTOR , 'ol[class="gws-flights-results__result-list"]')))
    
    # loop through all the Itinerary
    for result in search_results.find_elements_by_css_selector('div[class*="gws-flights-results__collapsed-itinerary"]'):
        price = result.find_element_by_css_selector('div[class="gws-flights-results__itinerary-price"]')
        print(price.text)
    

    输出 18 欧元

    【讨论】:

    • 您能否详细说明您试图从 URL 中获取价格的意思?
    • 我的错,我是说机票价格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2020-12-12
    • 2023-03-16
    • 1970-01-01
    • 2018-10-22
    • 2019-07-20
    • 1970-01-01
    相关资源
    最近更新 更多