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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:10:23