从Basketball Reference多超链接表格提取球员链接至Pandas新列
提取Basketball Reference表格中球员超链接至Pandas DataFrame
问题描述
需要从Basketball Reference的表格(比如MVP榜单)中提取每位球员的个人页面链接,存入Pandas DataFrame的新列。现有方法仅在球员链接是该行第一个链接时有效,当行内存在其他前置链接(如赛季联赛链接)时,会错误提取无关链接(如/leagues/NBA_2022.html),期望提取的是球员专属链接(如/players/j/jokicni01.html)。
解决方案
利用BeautifulSoup筛选符合球员链接特征的a标签:Basketball Reference的球员链接路径均以/players/开头,以此作为判断依据,精准定位目标链接。
示例代码
import pandas as pd from bs4 import BeautifulSoup import requests # 示例URL:2022年NBA MVP榜单页面 url = "https://www.basketball-reference.com/awards/awards_2022.html" response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') # 定位MVP表格 mvp_table = soup.find('table', id='mvp') # 将表格转为DataFrame df = pd.read_html(str(mvp_table))[0] # 提取球员链接的函数 def get_player_link(row): # 找到该行所有a标签 links = row.find_all('a') # 筛选以/players/开头的链接 for link in links: href = link.get('href') if href.startswith('/players/'): return href return None # 遍历表格的每一行,提取链接 player_links = [] for row in mvp_table.find('tbody').find_all('tr'): # 跳过表头行或空行 if row.find('th', {'scope': 'row'}) is None: continue player_link = get_player_link(row) player_links.append(player_link) # 将链接添加到DataFrame的新列 df['Player Link'] = player_links print(df[['Player', 'Player Link']].head())
当前错误输出
Player Player Link 0 Nikola Jokic /leagues/NBA_2022.html 1 Joel Embiid /leagues/NBA_2022.html 2 Giannis Antetokounmpo /leagues/NBA_2022.html
期望输出
Player Player Link 0 Nikola Jokic /players/j/jokicni01.html 1 Joel Embiid /players/e/embiidjo01.html 2 Giannis Antetokounmpo /players/a/antetgi01.html
关键说明
- 核心逻辑:通过判断链接
href属性是否以/players/开头,精准筛选球员个人页面链接,避免提取行内其他无关链接(如赛季、球队链接)。 - 兼容场景:适用于Basketball Reference所有包含球员列的表格(如常规赛场均数据、季后赛数据、奖项榜单等),只要球员链接符合
/players/xxx/xxxxxx.html的格式即可。
内容的提问来源于stack exchange,提问作者idekman
相关产品推荐
相关产品推荐

