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

使用BeautifulSoup无法抓取网页表格,table变量返回None求助

解决表格抓取返回None的问题

问题原因

这个页面的表格数据是JavaScript动态渲染的:直接用requests.get()获取的是服务器返回的初始静态HTML,其中并不包含实际的<table>标签——表格内容是浏览器加载页面后,通过AJAX请求从后端API拉取数据再生成的,所以BeautifulSoup找不到对应的table元素。

解决方案

方案1:直接请求数据API(推荐,效率更高)

通过浏览器开发者工具的「网络」面板,可以找到页面加载表格数据的真实API接口。对于这个页面,我们可以直接请求返回CSV格式数据的接口,无需解析HTML:

import requests
import pandas as pd

# 带csv=true参数的API接口,直接返回表格数据的CSV格式
api_url = "https://baseballsavant.mlb.com/leaderboard/outs_above_average?type=Fielder&startYear=2022&endYear=2022&split=no&team=&range=year&min=10&pos=of&roles=&viz=hide&csv=true"
response = requests.get(api_url)

# 解析CSV数据并输出前几行
data = pd.read_csv(pd.compat.StringIO(response.text))
print(data.head())

如果需要处理JSON格式数据,也可以找到对应的XHR请求接口,用response.json()解析。

方案2:使用浏览器自动化工具(处理动态渲染页面)

如果无法找到API接口,可以用Selenium模拟浏览器加载页面,待JavaScript渲染完成后再抓取HTML:

from selenium import webdriver
from bs4 import BeautifulSoup
import time

url = "https://baseballsavant.mlb.com/leaderboard/outs_above_average?type=Fielder&startYear=2022&endYear=2022&split=no&team=&range=year&min=10&pos=of&roles=&viz=show"

# 初始化Chrome浏览器驱动(需提前下载对应版本的chromedriver)
driver = webdriver.Chrome()
driver.get(url)

# 等待页面完全加载(根据网络情况调整等待时间)
time.sleep(3)

# 获取渲染后的页面源码
soup = BeautifulSoup(driver.page_source, "lxml")
table = soup.find("table")

if table:
    # 遍历表格行并输出单元格文本
    for row in table.find_all("tr"):
        print([cell.text.strip() for cell in row.find_all("td")])

# 关闭浏览器
driver.quit()

内容的提问来源于stack exchange,提问作者earningjoker430

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:31:00