如何使用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"one_answers"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)
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']]

您的方法存在的问题:你很亲密。添加到代码中的延迟的问题是,它们与元素的可见性没有直接关系(可能10秒的等待时间不够(。为了解决这个问题,在这段代码中,我使用了更具体的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')))

以等待类中所有元素的存在。代码解决方案对我很有效。如果你有任何问题,请在评论中告诉我。

最新更新