首页 > 解决方案 > Python Selenium 随机行为 - findElement 有时有效,有时与看似相同的代码无关

问题描述

使用 Selenium、Python、Pandas 抓取 autotrader.co.uk。我想要列出车辆的统计数据表,但由于某种原因,事实证明它比我想象的要困难......

完整代码在这里:pastebin链接

似乎有时无法识别“标题”和“价格”元素,但它与 html 上的代码完全相同:

工作项的 HTML(行索引 1):

<section class="product-card-pricing">

     <div class="product-card-pricing__content">

        <div class="product-card-pricing__price">

            <span>£16,500</span>


        </div>


    </div>

</section>

非工作 HTML(行索引 2):

<section class="product-card-pricing">

     <div class="product-card-pricing__content">

        <div class="product-card-pricing__price">

            <span>£12,995</span>


        </div>


    </div>

</section>

元素选择器:

data['Price'] = listing.find_elements_by_css_selector('section.product-card-pricing')[0].text

输出看起来像这样(根据相应的示例注意行 ID 1 和 2)

非常感谢任何帮助! 输出

标签: pythonseleniumweb-scraping

解决方案


您的问题与该站点显示 Cookie 权限对话框的事实有关,该对话框添加了一个 html 类,以防止页面滚动将 css 溢出设置为隐藏。

也就是说,selenium 尝试滚动到视口下方的第 n 个元素,但不能,也无法检索任何内容。

只需添加这些导入

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

和这些行(第一行和最后一行是您现有代码中的行)

    driver.get('https://www.autotrader.co.uk/car-search?sort=relevance&postcode=se83gt&radius=1500&make=LAND%20ROVER&model=RANGE%20ROVER%20EVOQUE&include-delivery-option=on&seller-type=private&page=' + str(current_page))
    # ADD FROM HERE -----------
    html = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located(
            (By.CSS_SELECTOR, "html.sp-message-open")
        )
    )
    driver.execute_script(
        "arguments[0].setAttribute('class',arguments[1])",
        html, 
        ''
    )
    # TO HERE -----------
    listings = driver.find_elements_by_css_selector('li.search-page__result')

上面的代码将产生以下输出:

DevTools listening on ws://127.0.0.1:64924/devtools/browser/6d3a45f2-6cbe-47af-8d92-5e52dabb4ad7   
                                               Title    Price  ... Attention Grabber  URL
0  Land Rover Range Rover Evoque 2.2 ED4 Pure Tec...  £10,500  ...               NaN  NaN
1  Land Rover Range Rover Evoque 2.2 TD4 Pure AWD...  £12,995  ...               NaN  NaN
2  Land Rover Range Rover Evoque 2.2 SD4 Pure Tec...  £10,495  ...               NaN  NaN
3  Land Rover Range Rover Evoque 2.2 SD4 Dynamic ...  £16,850  ...               NaN  NaN
4  Land Rover Range Rover Evoque 2.2 SD4 Dynamic ...  £11,999  ...               NaN  NaN
5  Land Rover Range Rover Evoque 2.0 eD4 SE Tech ...  £18,950  ...               NaN  NaN
6  Land Rover Range Rover Evoque 2.2 ED4 Pure 2WD...  £12,000  ...               NaN  NaN
7  Land Rover Range Rover Evoque 2.2 SD4 Pure Tec...  £13,620  ...               NaN  NaN
8  Land Rover Range Rover Evoque 2.0 TD4 HSE Dyna...  £17,900  ...               NaN  NaN
9  Land Rover Range Rover Evoque 2.0 eD4 SE (s/s)...  £18,000  ...               NaN  NaN

推荐阅读