如何使用BeautifulSoup提取FIBA赛事页面中data-module-group下DIV内的表格数据?
我帮你分析下这个问题,你遇到的情况很典型——这类体育赛事页面常常用动态加载(AJAX/ESI模块)来渲染内容,直接用BeautifulSoup静态解析肯定拿不到表格数据。下面给你几个可行的解决方向:
解决方向
1. 直接抓取AJAX/ESI请求的数据源
你看到的tab_ajax_content和@moduleident(...)提示了内容是通过ESI(Edge Side Includes)或者AJAX动态注入的。步骤如下:
- 打开浏览器开发者工具(F12),切换到Network面板
- 刷新页面,在过滤栏选择
XHR或者Fetch,同时可以搜索关键词如boxscore、game - 找到返回表格HTML或JSON数据的请求,查看它的请求URL和参数(比如你看到的
d45eda71-7aac-4017-b055-e70f29b1d352这类模块ID很可能是请求参数的一部分) - 直接用Python的
requests库请求这个接口,就能拿到原始的表格数据,不需要解析整个页面的静态HTML
2. 使用浏览器渲染工具处理动态内容
如果找不到对应的API接口,可以用模拟浏览器渲染的工具,让页面完全加载后再抓取:
- 用
selenium配合ChromeDriver/GeckoDriver:启动浏览器,访问目标页面,等待jet-game-boxscore元素加载完成,然后获取页面的page_source再用BeautifulSoup解析 - 更轻量的选择是
playwright,它自带浏览器驱动,API更简洁,同样能等待元素加载后抓取渲染后的HTML
示例代码(selenium):
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 driver = webdriver.Chrome() driver.get("https://www.fiba.basketball/eurobasket/2022/qualifiers/game/2202/Turkey-Croatia#|tab=boxscore") # 等待boxscore模块加载完成 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.ID, "jet-game-boxscore"))) # 获取渲染后的页面源码 soup = BeautifulSoup(driver.page_source, "html.parser") boxscore_table = soup.find("div", id="jet-game-boxscore").find("table") driver.quit()
3. 解析data-module属性中的加载地址
页面里的data-module-name="GAME_BOX_SCORE"和@moduleident(...)可能指向模块的加载URL。你可以尝试提取@moduleident()里的路径(比如/en/Module/d45eda71-7aac-4017-b055-e70f29b1d352/adad72a7-4113-4201-ae49-5b994ca0158b),拼接成完整的URL,直接请求这个地址就能拿到模块的HTML内容,里面应该包含你要的表格。
可行性确认
这个需求完全可以实现,因为动态加载的内容本质上还是通过HTTP请求获取的,只要找到对应的数据源或者让浏览器完成渲染,就能拿到表格数据。
内容的提问来源于stack exchange,提问作者Adam Sewell
相关产品推荐
相关产品推荐

