如何解决使用Pandas和Beautiful Soup抓取Baseball Reference指定投球数据表格时的“No tables found”错误?
如何解决使用Pandas和Beautiful Soup抓取Baseball Reference指定投球数据表格时的“No tables found”错误?
嘿,我刚好踩过类似的坑!你的问题根源其实特别直白——你用的表格ID拼写错了,Baseball Reference上的球队投球表格ID是用下划线分隔单词的,不是把所有词汇连在一起的。
咱们一步步拆解问题和解决办法:
问题到底出在哪?
你在代码里写的表格ID是ArizonaDiamondbackspitching,但打开目标页面检查实际的HTML元素就会发现,亚利桑那响尾蛇的投球表格真实ID是Arizona_Diamondbacks_pitching(球队名的单词之间用下划线隔开,再加上_pitching)。不管是pd.read_html还是BeautifulSoup的查找方法,找不到匹配的ID自然就会返回空列表或者抛出“No tables found”错误。
修正后的代码方案
方案1:直接用Pandas读取(最简洁)
只需要把表格ID改成正确的,再顺便处理下页面里重复的表头行(Baseball Reference的表格会在中间插入重复表头,需要清理掉):
import pandas as pd _URL = "https://www.baseball-reference.com/boxes/ARI/ARI202204070.shtml" # 替换为正确的带下划线的表格ID data = pd.read_html(_URL, attrs={'id': 'Arizona_Diamondbacks_pitching'}, header=1)[0] # 清理表格中重复的表头行(通过Name列值判断过滤) data = data[data['Name'] != 'Name'] # 注意index参数是布尔值,不要加引号(你原来的代码里写了index='False',这会把字符串作为索引列名) data.to_csv('boxscore.csv', index=False) print(data)
方案2:BeautifulSoup配合Pandas读取
如果你还是想用BeautifulSoup先定位表格,同样只要修正ID就能解决:
from bs4 import BeautifulSoup from io import StringIO import pandas as pd import requests # 用普通requests Session即可,你如果有自定义的BRefSession也可以继续用 session = requests.Session() _URL = "https://www.baseball-reference.com/boxes/ARI/ARI202204070.shtml" content = session.get(_URL).content soup = BeautifulSoup(content, "html.parser") # 用正确的ID精准定位表格 table = soup.find('table', id="Arizona_Diamondbacks_pitching") if table: data = pd.read_html(StringIO(str(table)), header=1)[0] # 同样清理重复的表头行 data = data[data['Name'] != 'Name'] data.to_csv('boxscore.csv', index=False) print(data) else: print("表格未找到,请再次确认ID是否正确")
小技巧:快速确认表格ID的方法
以后遇到网页抓取的元素定位问题,直接用浏览器开发者工具就能搞定:
- 打开目标页面,右键点击你要抓取的表格
- 选择“检查”(Inspect),浏览器会自动定位到表格的HTML元素
- 复制元素的
id属性值,直接用在代码里就不会出错啦!
备注:内容来源于stack exchange,提问作者Preston Albury
相关产品推荐
相关产品推荐

