#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