Случайное поведение Python Selenium — findElement иногда работает, иногда нет с, казалось бы, одинаковым кодом

#python #selenium #web-scraping

#python #селен #очистка веб-страниц

Вопрос:

Использование Selenium, Python, Pandas для очистки autotrader.co.uk . Мне бы хотелось получить таблицу статистики перечисленных транспортных средств, но по какой-то причине это оказывается сложнее, чем я думал…

Полный код здесь: ссылка на pastebin

кажется, что иногда элементы ‘title’ и ‘price’ не распознаются, но это точно такой же код в 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
 

Вывод выглядит следующим образом (обратите внимание на идентификаторы строк 1 и 2 в соответствии с соответствующими примерами)

Любая помощь приветствуется! Вывод

Ответ №1:

Ваша проблема связана с тем фактом, что на сайте отображается диалоговое окно разрешения файлов 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=relevanceamp;postcode=se83gtamp;radius=1500amp;make=LAND ROVERamp;model=RANGE ROVER EVOQUEamp;include-delivery-option=onamp;seller-type=privateamp;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
 

Комментарии:

1. Спасибо, Маттиа, сработал как шарм! Также оцените объяснение. Вознаграждение должно быть присуждено как можно скорее — мне приходится ждать еще 16 часов, но вы, сэр, выиграли его!

2. Рад быть полезным!

Ответ №2:

Получить подэлемент listing css selector здесь не сработает. Я бы также добавил, что webdriver ожидает появления всплывающих файлов cookie.

 data['Price'] = listing.find_element_by_xpath(".//section[@class='product-card-pricing']").text
#print(data['Price'])
data['Title'] = listing.find_element_by_xpath(".//h3[@class='product-card-details__title']").text
#print(data['Title'])
 

Выводит

 £10,500
Land Rover Range Rover Evoque 2.2 ED4 Pure Tech 2WD 5dr
£16,500
Land Rover Range Rover Evoque 2.2 SD4 Pure Tech AWD 5dr
 

Комментарии:

1. Спасибо @Arundeep, к сожалению, он все еще не работает. Смотрите Вывод здесь: imgur.com/a/eyX3jx4