硒+ BS4检索隐藏的元素

时间:2019-02-16 16:22:15

标签: python html web-scraping beautifulsoup html-parsing

我编写了以下代码来检索带有“ tab-statistics-1-statistic”类的div。这个嵌套在“统计内容” div中。

soup.find(id="statistics-content").find(id="tab-statistics-1-statistic")

但是当我打印上一行的输出时,即使在“检查元素”中div包含嵌套元素,它也仅返回“ div id ='statistics-content'>”。该代码使用的页面是https://www.flashscore.com/match/CM2dBaSF/#match-summary

Inspect element of page

如何获取div中的嵌套元素?

2 个答案:

答案 0 :(得分:1)

您正在导航到登录页面,但需要单击进入“统计信息”选项卡以生成所需的html。您需要留出时间让javascript运行以填充信息。

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
d = webdriver.Chrome()
url ='https://www.flashscore.com/match/CM2dBaSF/#match-summary'

d.get(url)
d.find_element_by_id('a-match-statistics').click()
item = WebDriverWait(d, 5).until(EC.presence_of_element_located((By.ID , 'tab-statistics-0-statistic')))
print(item.text)
d.quit()

随着为“统计信息”标签生成一个新的网址,您可以直接使用该直接网址

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
d = webdriver.Chrome()
urlDirect = 'https://www.flashscore.com/match/CM2dBaSF/#match-statistics;0'
d.get(urlDirect)
item = WebDriverWait(d, 5).until(EC.presence_of_element_located((By.ID , 'tab-statistics-0-statistic')))
print(item.text)
d.quit()

答案 1 :(得分:0)

在浏览器和开发工具中,您将获得这些值,因为浏览器可能已经加载了内容。使用硒时,您将必须模拟相同的行为。等待一段时间,直到通过使用将内容加载到硒Web驱动程序中 WebDriverwait

下面的示例代码。

driver=driver = webdriver.Chrome("D:\\chromedriver.exe") driver.get('https://www.flashscore.com/match/CM2dBaSF/#match-statistics;0') WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID ,'tab-statistics-1-statistic') html = driver.page_source soup=BeautifulSoup(html) print(soup.find(id="statistics-content").find(id="statistics-1-statistic"))

样本输出

<li class="li1" id="statistics-1-statistic"><span><a onclick="detail_tab(['statistics', '1-statistic']);">1st Half</a></span></li>