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

