Skip to main content
 首页 » 编程设计

python之如何用 BeautifulSoup 抓取页面页面源不匹配检查元素

2024年09月03日6zlslch

我正试图从 this fantasy basketball page 中抓取一些东西.我在 Python 3.5+ 中使用 BeautifulSoup 来执行此操作。

source_code = requests.get('http://fantasy.espn.com/basketball/league/standings?leagueId=633975') 
plain_text = source_code.text 
soup = BeautifulSoup(plain_text, 'lxml') 

首先,我想将 9 个类别的标题抓取到一个 Python 列表中。所以我的列表应该类似于 categories = [FG%, FT%, 3PM, REB, AST, STL, BLK, TO, PTS]

我希望做的是类似下面的事情:

tableSubHead = soup.find_all('tr', class_='Table2__header-row') 
tableSubHead = tableSubHead[0] 
listCats = tableSubHead.find_all('th') 
categories = [] 
for cat in listCats: 
  if 'title' in cat.attrs: 
  categories.append(cat.string) 

但是,soup.find_all('tr', class_='Table2__header-row') 返回一个空列表而不是我想要的表行元素。我怀疑这是因为当我查看页面源代码时,它与 Chrome Dev Tools 中的 Inspect Element 完全不同。我知道这是因为 Javascript 会动态更改页面上的元素,但我不确定解决方案是什么。

请您参考如下方法:

您面临的问题是因为该网站是一个网络应用程序,这意味着必须运行 javascript 才能生成您所看到的内容,您不能使用 request 运行 javascript,这是我使用 selenium 获得结果的方法,它打开 headless 浏览器并通过等待一段时间来启用 javascript 首先运行:

import requests 
from bs4 import BeautifulSoup 
from selenium import webdriver 
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 
import time 
 
# source_code = requests.get('http://fantasy.espn.com/basketball/league/standings?leagueId=633975') 
 
options = webdriver.ChromeOptions() 
options.add_argument('headless') 
capa = DesiredCapabilities.CHROME 
capa["pageLoadStrategy"] = "none" 
driver = webdriver.Chrome(chrome_options=options, desired_capabilities=capa) 
driver.set_window_size(1440,900) 
driver.get('http://fantasy.espn.com/basketball/league/standings?leagueId=633975') 
time.sleep(15) 
 
plain_text = driver.page_source 
soup = BeautifulSoup(plain_text, 'lxml') 
 
soup.select('.Table2__header-row') # Returns full results. 
 
len(soup.select('.Table2__header-row')) # 8 

这种方法将允许您运行设计为网络应用程序的网站,并极大地扩展您的功能。 - 您甚至可以添加要执行的命令,例如滚动或单击以在航类加载更多资源。

使用pip install selenium 安装selenium。如果您喜欢该浏览器,还允许您使用 Firefox。