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

如何从Basketball Reference多表页面提取MVP球员链接至新列?

解决Basketball Reference MVP球员链接提取问题

你的核心问题是没有从目标MVP表中同步提取链接,而是依赖固定表索引拿数据,导致无关链接混入且对应关系混乱。以下是修正后的实现思路和代码:

关键修正点

  • 不再通过固定索引soup.findAll('table')[1]取表,直接用你已经筛选出的MVP表(tabs = soup.select('table[id*="mvp"]'))
  • 遍历MVP表的每一行时,同步提取该行球员的个人页面链接,保证数据和链接一一对应
  • 跳过无关的tfoot汇总行(如果不需要统计数据)

修正后的代码

import requests
from bs4 import BeautifulSoup
import pandas as pd 

url='https://www.basketball-reference.com/awards/awards_2022.html'
html = requests.get(url).text.replace('<!--', '').replace('-->', '')
soup = BeautifulSoup(html, "html.parser")

# 只筛选MVP相关的表
mvp_tables = soup.select('table[id*="mvp"]')
mvp_table = mvp_tables[0]

cols = []
# 提取表头(第二行的th)
for th in mvp_table.select('thead tr:nth-child(2) th'):
    cols.append(th.text.strip())

players_data = []
player_links = []

# 遍历tbody里的每一行球员数据
for row in mvp_table.select('tbody tr'):
    # 提取该行的所有文本数据
    row_data = [dat.text.strip() for dat in row.select('td, th')]
    players_data.append(row_data)
    
    # 提取该行球员的个人页面链接(球员名在<th scope="row">下的a标签)
    player_a_tag = row.select_one('th[scope="row"] a')
    if player_a_tag:
        player_links.append(player_a_tag.get('href'))
    else:
        player_links.append('')

# 确保数据长度一致
max_length = max(len(row) for row in players_data)
players_plus = [row + [""]*(max_length - len(row)) for row in players_data]

# 构建DataFrame并添加链接列
df = pd.DataFrame(players_plus, columns=cols)
df['Playerlinks'] = player_links

print(df.to_markdown())

代码说明

  1. 精准定位MVP表:用select('table[id*="mvp"]')确保只处理MVP投票结果表,不受页面其他表影响
  2. 同步提取数据与链接:遍历tbody的每一行时,直接从该行的球员名标签中提取链接,完全避免无关链接
  3. 数据对齐:每一行数据对应一个链接,不会出现顺序错乱的问题

运行后就能得到12条正确的球员链接,和数据行一一对应,比如首行就是约基奇的/players/j/jokicni01.html。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:20:30