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

Python爬取Transfermarkt数据:如何区分同class的球员与球队信息

解决Transfermarkt爬取时球员与球队信息混同的问题

问题根源

原代码直接抓取所有td.hauptlink元素,但该类名同时用于球员名称、转出球队、转入球队三个位置的单元格,导致结果混入球队信息。

两种可行解决方案


方案1:按行遍历(更稳定,适配页面结构)

页面中每条转会记录对应一行tr(类为odd或even),球员信息固定在每行的第二列。通过遍历每行提取指定列的内容,可精准区分球员与球队:

from bs4 import BeautifulSoup
import requests
import pandas as pd

headers = {'User-Agent': 
           'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.100 Safari/537.36'}

page = "https://www.transfermarkt.co.uk/transfers/transferrekorde/statistik/top/plus/0/galerie/0?saison_id=2000"
pageTree = requests.get(page, headers=headers)
pageSoup = BeautifulSoup(pageTree.content, 'html.parser')

# 定位所有转会记录行(排除表头、分页等无关行)
transfer_rows = pageSoup.find_all('tr', class_=['odd', 'even'])

PlayersList = []
ValuesList = []

# 遍历前25条记录
for row in transfer_rows[:25]:
    # 球员位于每行的第2个td(索引1),提取并清理文本
    player_name = row.find_all('td')[1].get_text(strip=True)
    PlayersList.append(player_name)
    
    # 转会费位于指定类的td中,提取并清理文本
    transfer_value = row.find('td', class_='rechts hauptlink').get_text(strip=True)
    ValuesList.append(transfer_value)

df = pd.DataFrame({"Players": PlayersList, "Values": ValuesList})
print(df.head(10))

方案2:通过链接特征筛选球员单元格

球员名称的td内部包含指向球员个人主页的链接(URL含/profil/spieler/),而球队链接含/verein/,据此过滤:

from bs4 import BeautifulSoup
import requests
import pandas as pd

headers = {'User-Agent': 
           'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.100 Safari/537.36'}

page = "https://www.transfermarkt.co.uk/transfers/transferrekorde/statistik/top/plus/0/galerie/0?saison_id=2000"
pageTree = requests.get(page, headers=headers)
pageSoup = BeautifulSoup(pageTree.content, 'html.parser')

# 抓取所有hauptlink类的td,再筛选包含球员链接的单元格
all_hauptlink_td = pageSoup.find_all("td", {"class": "hauptlink"})
player_tds = [td for td in all_hauptlink_td if td.find('a', href=lambda x: x and '/profil/spieler/' in x)]

# 提取球员名称(取前25个)
PlayersList = [td.get_text(strip=True) for td in player_tds[:25]]

# 转会费提取逻辑不变
Values = pageSoup.find_all("td", {"class": "rechts hauptlink"})
ValuesList = [val.get_text(strip=True) for val in Values[:25]]

df = pd.DataFrame({"Players": PlayersList, "Values": ValuesList})
print(df.head(10))

额外优化

使用get_text(strip=True)可自动去除文本中的换行符和多余空格,解决原代码中'\nLuís Figo '这类带格式的文本问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:03:28