我正试图从 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。