pd.read_html读取网页时匹配Shooting表格失败报错问题
问题产生原因
Basketball Reference站点的Shooting投篮数据表,默认被包裹在HTML注释标签<!-- -->内部,不属于页面初始加载的正常DOM表格元素。pandas.read_html()默认只会提取DOM流里直接存在的<table>标签内容,不会主动解析注释块里藏着的表格,所以会抛出找不到匹配表格的异常。
Roster、Totals这类表格本身直接写在正常DOM结构里,没被注释包裹,所以把match参数换成这两个关键词时能正常读到对应表格。
解决方法
先把完整页面源码拉下来,手动删掉注释标签把藏在注释里的表格放出来,再调用read_html匹配读取就行,参考代码如下:
import pandas as pd import requests target_url = "https://www.basketball-reference.com/teams/MIA/2022.html" # 带常规浏览器UA请求,避免被站点反爬拦截返回403 resp = requests.get( target_url, 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"} ) # 替换掉注释标识,把注释里包的表格释放到正常HTML结构中 processed_html = resp.text.replace("<!--", "").replace("-->", "") # 匹配Shooting关键词,返回列表的第一个元素就是目标投篮数据表 shooting_df = pd.read_html(processed_html, match="Shooting")[0]
补充注意点:
- 读出来的Shooting表默认是多级列索引结构,直接用会出现列名重复的问题,可以根据自己的分析需求把多级列名拼接成单级列名,做扁平化处理
- 不要高频重复请求站点,容易被封IP,单次请求失败的话可以加个几秒的间隔再重试
内容的提问来源于stack exchange,提问作者beridzeg45
相关产品推荐
相关产品推荐

