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
相关产品推荐
相关产品推荐

