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

使用pandas爬取多表格网页时如何正确提取指定DataFrame

问题原因
  • 目标网站除了默认展示的总防守统计表、顶部的分区排名小表之外,其余所有细分数据表格都被HTML注释标签<!-- -->包裹,属于典型的前端懒加载逻辑:只有用户点击对应分类tab时,JS才会移除注释把表格渲染到页面上。pandas.read_html本身不执行JS,也不会解析注释内部的内容,默认请求下只能识别到2个外露的表格,取索引2自然会触发索引越界错误。
  • 之前取索引1得到的无表头表格,是页面顶部美联、国联分区排名的小模块,本身结构零散没有规整的统计类表头,不属于目标防守对手数据范畴;另外给所有表格统一硬编码header=1不符合页面实际结构:不同统计表格的表头行位置存在差异,统一传参必然出现表头错位、缺失的问题。
解决方法
  1. 先发起请求拿到完整页面源码,手动移除源码里的HTML注释标记,把被注释隐藏的表格代码释放出来,再交给pandas.read_html解析,不需要用Selenium等重浏览器工具,效率更高依赖更少。
  2. 不要硬编码表格索引和header参数,解析完所有表格后先遍历确认每个表格的内容,再针对目标表格单独设置表头参数提取。
  3. 请求时添加正常的User-Agent头,绕过网站基础反爬策略。
可直接运行的示例代码
import requests
import pandas as pd

year = 2021
url = f'https://www.pro-football-reference.com/years/{year}/opp.htm'
# 配置正常浏览器请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}

resp = requests.get(url, headers=headers)
resp.raise_for_status()
# 替换注释标签,释放被隐藏的表格
html_content = resp.text.replace('<!--', '').replace('-->', '')

# 解析所有表格
all_tables = pd.read_html(html_content)
print(f"共解析到{len(all_tables)}个表格") # 处理后可得到8个左右表格,覆盖所有细分防守数据

# 遍历确认目标表格位置,首次使用可打开下方注释查看每个表的内容
# for idx, df in enumerate(all_tables):
#     print(f"===== 表格索引{idx} =====")
#     print(df.head(2))
#     print(df.columns)

# 示例:提取总防守数据表格,索引可根据自己遍历的结果调整
df_defense_total = all_tables[2]
# 过滤长表格中重复插入的表头行
df_defense_total = df_defense_total[df_defense_total['Rk'] != 'Rk']
print(df_defense_total.head())
注意事项
  • 处理完注释后,顶部无表头的分区排名表依然会在解析结果中,遍历时直接跳过即可。
  • 网站的长数据表格会在每10行左右重复插入一行表头,提取后需要过滤掉Rk列值等于Rk的脏数据行。
  • 如果需要爬取多年数据,建议请求间隔加1-2秒延时,避免触发网站访问频率限制被临时封禁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:39:38