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

BeautifulSoup爬取fbref阿森纳进球球员时如何排除红牌相关div

爬取阿森纳进球球员数据的红牌过滤方案

需求说明

  • 采集目标足球数据站点中,阿森纳每场赛事所有取得进球的球员信息
  • 过滤规则:仅被出示红牌、未取得进球的球员数据不纳入采集结果

事件区分规则

页面内两类事件的DOM结构差异集中在事件图标的class属性:

  • 需保留的进球事件:事件图标class包含goal,结构示例:
<div><div class="event_icon goal"></div> <a href="/en/players/d5dd5f1f/Pierre-Emerick-Aubameyang">Pierre-Emerick Aubameyang</a> · 17’</div>
  • 需排除的红牌事件:事件图标class包含red_card,结构示例:
<div><div class="event_icon red_card"></div> <a href="/en/players/e61b8aee/Granit-Xhaka">Granit Xhaka</a> · 35’</div> </div>

原代码问题

原有逻辑直接遍历主/客队比分区块下的所有子节点,未对事件类型做前置判断,会把红牌、黄牌、换人等非进球事件的球员信息一并采集。

修复后代码

核心修改点:遍历每个事件div时,先校验事件图标class是否包含goal,非进球事件直接跳过,不采集对应球员信息。

import re
import requests
from bs4 import BeautifulSoup

match_data_list = []

for index, team in enumerate(team_list):
    link, opponent, venue = team
    # 开发阶段仅迭代前5条数据
    if index > 4:
        break
    data_team_stat = requests.get(link)
    soup_team = BeautifulSoup(data_team_stat.text, 'html.parser')
    
    # 主客场对应不同的DOM容器id
    if venue == "Home":
        match_data = soup_team.select('div.scorebox div#a')
    else:
        match_data = soup_team.select('div.scorebox div#b')

    for event_div in match_data:
        # 校验事件类型,非进球直接跳过
        event_icon = event_div.select_one('div.event_icon')
        if not event_icon or 'goal' not in event_icon.get('class', []):
            continue
        
        # 提取进球球员信息
        player_text = event_div.get_text()
        player_name = re.sub("[^A-Za-z*éØ\s-]","",player_text)
        player_name = player_name.strip()
        if player_name:
            match_data_list.append((player_name, opponent))

补充说明

该判断逻辑会自动过滤红牌、黄牌、换人等所有非进球类型的事件,不需要单独编写红牌专属排除规则,扩展性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 21:54:32