You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BeautifulSoup返回空td标签:无法抓取动态渲染表格数据

问题:抓取动态渲染的表格数据仅返回空行

我尝试从URL http://baloncestoenvivo.feb.es/Game/1881578 抓取数据,目标是获取id为keyfacts-playbyplay-content-scroll的div内表格的所有信息。通过代码定位到该表格后,打印结果仅得到一个无数据的<tr>标签,但在Firefox或Chrome控制台中能看到该表格包含799条带数据的table rows。

为什么会出现这种情况?

这几乎可以肯定是动态内容加载在搞鬼:你用代码发起的普通HTTP请求(比如Python的requests库)只能拿到页面的初始HTML骨架,而表格里的799条数据是页面加载完成后,通过JavaScript异步请求后端接口获取并渲染出来的。浏览器控制台能看到数据,是因为浏览器自动执行了页面的JS代码完成了数据填充;但普通HTTP请求不会执行JS,自然拿不到动态加载的内容。

两种可行的解决方案

方案1:用浏览器自动化工具(Selenium)模拟真实浏览器行为

这种方法会完全模拟用户在浏览器里的操作,等待JS加载完成后再抓取数据,最贴近浏览器的实际表现。

举个Python的示例代码:

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

# 初始化Chrome浏览器驱动(需提前下载对应版本的chromedriver)
driver = webdriver.Chrome()
driver.get("http://baloncestoenvivo.feb.es/Game/1881578")

try:
    # 等待表格加载完成,最多等待10秒
    table_container = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "keyfacts-playbyplay-content-scroll"))
    )
    # 获取所有表格行
    rows = table_container.find_elements(By.TAG_NAME, "tr")
    # 输出结果
    print(f"共抓取到{len(rows)}条数据")
    for row in rows:
        print(row.text)
finally:
    driver.quit()

方案2:直接调用后端API接口(更高效)

浏览器渲染数据肯定是从后端接口获取的,我们可以跳过页面渲染环节,直接找到这个接口请求原始数据,速度更快且数据结构更清晰。

操作步骤:

  • 打开Chrome/Firefox开发者工具(F12),切换到「网络」面板
  • 刷新页面,过滤「XHR」或「Fetch」类型的请求
  • 查找包含playbyplay、game这类关键词的请求,查看响应内容找到返回表格数据的接口
  • 复制该接口的URL,用requests等工具直接请求,就能拿到结构化的JSON数据(比解析HTML更方便)

比如你可能会找到类似/api/game/1881578/playbyplay这样的接口,直接请求它就能获取所有赛事数据。

内容的提问来源于stack exchange,提问作者José Carlos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:21:16