Как спарсить данные на Python через Selenium?
Мне нужно достать данные с помощью Selenium со страницы, которых нет в самом коде страницы (я не шарю, но, видимо, это JavaScript). Вот как я делаю:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
path = '...'
URL = '...'
driver = webdriver.Chrome(executable_path=path) # он подключается к Chrome
driver.get(URL) # и успешно переходит по ссылке, все ОК
Для справки
Вот так выглядит код 1 из элементов, которые мне нужны:
<span class="wrapper__top_3ztMC">
Машинное зрение DA
</span>
И тут у меня возникает 3 вопроса.
Вопрос первый. Почему не работает это:
1)
result = driver.find_element_by_class_name('wrapper__top_3ztMC')
result = driver.find_element(By.XPATH, "//span[@class='wrapper__top_3ztMC']")
result = driver.find_element_by_xpath('//span[@class="wrapper__top_3ztMC"]')
Везде 1 и та же ошибка:
NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//span[@class='wrapper__top_3ztMC']"}
(Session info: chrome=86.0.4240.75)
Вопрос второй. Почему не работает это:
result = driver.execute_script("return document.getElementsByClassName('wrapper__top_3ztMC')")
result
Возвращает пустой массив [].
НО! Вот это:
element = WebDriverWait(driver, 50).until(
EC.presence_of_element_located((By.CLASS_NAME, "wrapper__top_3ztMC"))
)
возвращает мне элемент самый первый (так как я делаю задержку до обнаружения). В итоге: видимо, первые случаи не работают, а последний работает, потому что данные отображаются не сразу, и требуется немного подождать, пока страница прогрузится.
Вопрос главный.
Как сделать так, чтобы выводился не первый элемент, а абсолютно все, у которых класс удовлетворяет указанному? Кстати, еще проблема - страница длинная, и чтобы остальные элементы также отобразились, необходимо проскроллить до конца - это также нужно учесть. Спасибо.