如何从Baseball Reference抓取投手被击球数据?解决注释内数据问题
抓取Baseball Reference投手数据的解决方法
你说得对,这个页面的投手数据确实被放在HTML注释里了,直接遍历tr只能拿到顶部的球队汇总数据。下面是具体的解决代码和步骤:
核心思路
页面里的投手统计表格被包裹在<!-- ... -->注释标签中,需要先提取这部分注释内容,再转换成可解析的HTML结构,之后就能正常提取数据了。
完整代码
import requests from bs4 import BeautifulSoup as bs from bs4 import Comment # 请求目标页面 url = "https://www.baseball-reference.com/leagues/majors/2022-batting-pitching.shtml" page = requests.get(url) soup = bs(page.content, "html.parser") # 提取页面中所有HTML注释 comments = soup.find_all(text=lambda text: isinstance(text, Comment)) # 筛选出包含投手数据表格的注释块 pitching_table_comment = None for comment in comments: if '<table class="stats_table" id="pitching"' in comment: pitching_table_comment = comment break # 将注释内容转换成可解析的Soup对象 pitching_soup = bs(pitching_table_comment, "html.parser") # 遍历投手数据行,提取指定字段 pitcher_data_list = [] for tr in pitching_soup.find_all('tr')[1:]: # 跳过表头行 tds = tr.find_all('td') if len(tds) >= 14: # 确保字段数量足够 # 提取对应索引的字段:Rk[0], Name[1], IP[4], HR[13] pitcher_info = [ tds[0].text.strip(), # Rk tds[1].text.strip(), # Name tds[4].text.strip(), # IP tds[13].text.strip() # HR ] pitcher_data_list.append(pitcher_info) # 示例:打印Sandy Alcantara的数据 for pitcher in pitcher_data_list: if pitcher[1] == "Sandy Alcantara": print("Sandy Alcantara的数据:", pitcher) # 也可以打印所有投手的目标数据 # for pitcher in pitcher_data_list: # print(pitcher)
关键步骤说明
- 提取注释:用
Comment类识别页面中的注释内容,筛选出包含投手表格(id为pitching)的注释块。 - 重新解析:把筛选到的注释文本转换成BeautifulSoup对象,这样就能像处理普通HTML一样提取表格数据。
- 字段提取:按照你指定的索引提取
*Rk*、*Name*、*IP*、*HR*字段,整理成列表存储。
运行这段代码后,就能拿到所有投手的目标数据,包括Sandy Alcantara的失垒打数(HR)。
内容的提问来源于stack exchange,提问作者ryan
相关产品推荐
相关产品推荐

