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
相关产品推荐
相关产品推荐

