如何使用Pandas从HTML代码中抓取指定的div标签?
解决NBA赛事页面动态内容抓取问题
问题根源
NBA官网的赛事报道内容是通过JavaScript动态渲染生成的,requests库只能获取页面的初始静态HTML源码,这部分源码里并不包含你要找的id="story"的div标签,所以用BeautifulSoup查找会返回空结果。
解决方案
方法1:用Selenium模拟浏览器加载动态内容
Selenium可以模拟真实浏览器的行为,等待页面完全加载后再获取渲染后的源码,这样就能拿到包含动态内容的HTML。
步骤:
- 安装Selenium:
pip install selenium - 下载对应浏览器的驱动(比如ChromeDriver,需和你的Chrome版本匹配),并确保驱动路径配置正确。
示例代码:
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.nba.com/game/bkn-vs-phi-0022100993' # 初始化Chrome浏览器驱动 driver = webdriver.Chrome() driver.get(url) # 等待目标元素加载完成,最多等待10秒 try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, 'story')) ) # 获取渲染后的页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, 'html.parser') story = soup.find('div', {'id': 'story'}) print(story.get_text(strip=True)) finally: # 关闭浏览器 driver.quit()
方法2:直接调用NBA的API接口(更高效)
通过浏览器开发者工具的Network面板,能找到NBA官网加载赛事报道的API接口,直接请求API获取JSON格式的数据,比解析HTML更稳定高效。
示例代码:
import requests # 赛事ID为URL中的0022100993,拼接API地址 api_url = 'https://data.nba.com/data/v2015/json/mobile_teams/nba/2021/scores/gamedetail/0022100993_gamedetail.json' response = requests.get(api_url) data = response.json() # 从JSON中提取赛事报道内容(具体字段需根据API返回结构调整) story_content = data['g']['gd']['pl'] print(story_content)
注意事项
- 使用Selenium时,浏览器驱动版本要和浏览器版本匹配,避免兼容性问题。
- 调用API时,可适当添加浏览器请求头,避免被网站拦截。
- 批量抓取时控制请求频率,避免触发反爬机制。
内容的提问来源于stack exchange,提问作者Anthony Madle
相关产品推荐
相关产品推荐

