Веб-драйвер Selenium возвращает пустой список из find_elements_by_X - PullRequest
0 голосов
/ 23 января 2020

Моя цель - получить список имен всех новых предметов, которые были размещены на https://www.prusaprinters.org/prints в течение полных 24 часов данного дня.

Через немного прочитав Я узнал, что мне следует использовать Selenium, потому что сайт, который я копирую, является динамическим c (загружает больше объектов по мере прокрутки пользователем).

Проблема в том, что я не могу получить что-либо, кроме пустого списка от webdriver.find_elements_by_ с любым из суффиксов, перечисленных в https://selenium-python.readthedocs.io/locating-elements.html.

На сайте я вижу "class = name" и "class = clamp-two-lines", когда я проверяю элемент, для которого я хочу получить заголовок (см. скриншот), но я не могу вернуть список всех элементов на странице с этим классом name или clamp-two-lines.

prusaprinters inspect element

Вот код, который у меня есть (закомментированные строки - неудачные попытки):

from timeit import default_timer as timer
start_time = timer()
print("Script Started")

import bs4, selenium, smtplib, time
from bs4 import BeautifulSoup 
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.Chrome(r'D:\PortableApps\Python Peripherals\chromedriver.exe')

url = 'https://www.prusaprinters.org/prints'
driver.get(url)
# foo = driver.find_elements_by_name('name')
# foo = driver.find_elements_by_xpath('name')
# foo = driver.find_elements_by_class_name('name')
# foo = driver.find_elements_by_tag_name('name')
# foo = [i.get_attribute('href') for i in driver.find_elements_by_css_selector('[id*=name]')]
# foo = [i.get_attribute('href') for i in driver.find_elements_by_css_selector('[class*=name]')]
# foo = [i.get_attribute('href') for i in driver.find_elements_by_css_selector('[id*=clamp-two-lines]')]
# foo = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="printListOuter"]//ul[@class="clamp-two-lines"]/li')))
print(foo)
driver.quit()

print("Time to run: " + str(round(timer() - start_time,4)) + "s")

Мое исследование:

  1. Selenium возвращает только пустой список
  2. Selenium find_elements_by_css_selector возвращает пустой список
  3. Web Scraping Python (BeautifulSoup, Requests)
  4. Получить HTML Источник WebElement в Selenium WebDriver с использованием Python
  5. Как получить код проверки элемента в Selenium WebDriver
  6. Web Scraping Python (BeautifulSoup, Requests)
  7. https://chrisalbon.com/python/web_scraping/monitor_a_website/
  8. https://www.codementor.io/@gergelykovcs / как и почему я сделал простой веб-скрапиг-сценарий, чтобы уведомить нас о нашей любимой еде-fcrhuhn45
  9. https://www.tutorialspoint.com/python_web_scraping/python_web_scraping_dynamic_websites.htm

Ответы [ 2 ]

1 голос
/ 23 января 2020

Для получения текста дождитесь видимости элементов. Css селектор для названий #printListOuter h3:

titles = WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, '#printListOuter h3')))

for title in titles:
    print(title.text)

Укороченная версия:

wait = WebDriverWait(driver, 10)
titles = [title.text for title in wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, '#printListOuter h3')))]
1 голос
/ 23 января 2020

Это xpath названия предметов:

.//div[@class='print-list-item']/div/a/h3/span
...