Как получить весь исходный код с веб-страницы с помощью selenium / webdriver?

#python-3.x #selenium #selenium-webdriver #web-scraping

#python-3.x #селен #selenium-webdriver #веб-очистка

Вопрос:

Я успешно использую эту программу на python (обычно) для создания веб-страниц. Это дает мне не только исходный код страницы, но и код, который скрыт за Javascript. Однако на этом конкретном веб-сайте он работает не так, как хотелось бы. Информация отсутствует. Похоже, это не проблема с синхронизацией.

 from selenium import webdriver

url = "https://www.youbet.dk/sport/fodbold/"

options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome(executable_path='D:/Programme/chromedriver_win32/chromedriver.exe',options=options)
driver.get(url)
 

После выполнения driver.page_source содержит код.

Меня интересует текст на кнопках (название команды и номер). Щелчок правой кнопкой мыши и проверка кнопки в Chrome дают мне что-то вроде следующего кода, который содержит информацию, которую я ищу (здесь «Villarreal» и «1.51»):

 <button class="rj-ev-list__bet-btn  rj-ev-list__selection-0ML54283820_1" data-uat="button-ev-list-bet-btn"><div class="rj-ev-list__bet-btn__inner " data-uat="div-ev-list-bet-btn-inner"><div class="rj-ev-list__bet-btn__row" data-uat="div-ev-list-bet-btn-row"><span class="rj-ev-list__bet-btn__content rj-ev-list__bet-btn__text" data-uat="ev-list-ev-list-bet-btn-text">Villarreal</span></div><div class="rj-ev-list__bet-btn__row" data-uat="div-ev-list-bet-btn-row"><span class="rj-ev-list__bet-btn__content rj-ev-list__bet-btn__odd" data-uat="ev-list-ev-list-bet-btn-odd">1.51</span></div></div><span class="rj-ev-list__bet-btn__arrow-up"></span><span class="rj-ev-list__bet-btn__arrow-down"></span></button>
 

Но это не отображается в driver.page_source.

Как я могу получить доступ к этой информации с помощью python и selenium?

Это не помогло:

 * Adding time.sleep(10)
* Adding driver.implicitly_wait(10)
 

Ответ №1:

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

url = "https://www.youbet.dk/sport/fodbold/"

options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome(options=options)
driver.get(url)
WebDriverWait(driver, 20).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'rj-ev-list__bet-btn__inner')))
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
mydivs = soup.find_all("button", {"class": "rj-ev-list__bet-btn"})
alldata = [[div.find("span", {"class": "rj-ev-list__bet-btn__content"}).text,
            div.find("span", {"class": "rj-ev-list__bet-btn__odd"}).text] for div in mydivs]
print(alldata)
driver.quit()
# [['Fulham', '2.55'], ['Uafgjort', '3.40'], ['Leeds', '2.80'], ['Real Betis', '1.83'], ['Uafgjort', '3.65'], ['Levante', '4.55'], ['Parma', '2.40'], ['Uafgjort', '3.10'], ['Genoa', '3.35']]
 

Проблема с вашим подходом:
Вы были близки. Проблема с задержками, которые вы добавили в свой код, заключалась в том, что они не были напрямую связаны с видимостью элемента (возможно, десяти секунд ожидания было недостаточно). Чтобы устранить проблему, в этом коде я использовал более конкретный WebDriverWait (дополнительный ресурс: https://www.geeksforgeeks.org/explicit-waits-in-selenium-python /)

 WebDriverWait(driver, 20).until(EC.presence_of_all_elements_located(
(By.CLASS_NAME, 'rj-ev-list__bet-btn__inner')))
 

дождаться наличия всех элементов в классе. Кодовое решение сработало для меня. Скажите мне в комментариях, если у вас возникнут какие-либо проблемы.

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

1. Большое спасибо! Это решило проблему, и вы дали мне ценную информацию для будущих проектов.