如何从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())
代码说明
- 精准定位MVP表:用
select('table[id*="mvp"]')确保只处理MVP投票结果表,不受页面其他表影响 - 同步提取数据与链接:遍历tbody的每一行时,直接从该行的球员名标签中提取链接,完全避免无关链接
- 数据对齐:每一行数据对应一个链接,不会出现顺序错乱的问题
运行后就能得到12条正确的球员链接,和数据行一一对应,比如首行就是约基奇的/players/j/jokicni01.html。
内容的提问来源于stack exchange,提问作者idekman
相关产品推荐
相关产品推荐

