Web Scraping中IF语句输出错误:Jimmy Butler数据提取失败
Jimmy Butler数据爬取问题:错误原因与修复方案
一、IF分支未触发的核心原因
你的代码始终进入else分支,是因为行匹配逻辑完全错误:
- 在Jimmy Butler的个人页面中,
per_game表格的每行<th>元素显示的是赛季年份(如2022-23),而非球员名字。整个表格里的所有行都是Jimmy的赛季数据,根本不存在行<th>文本为Jimmy Butler的情况,所以jimmy_butler_row永远为None。
此外,代码还存在索引使用错误:stats[22.9]这种用浮点数当列表索引的写法完全不合法,列表索引必须是整数,就算找到行也会直接报错。
二、HTML数据提取的正确流程
- 先确认页面结构:打开目标URL,右键查看页面源码,定位数据所在的表格ID、行/列的标识规则(比如个人页面的表格行都是该球员的数据,无需匹配名字)。
- 请求并解析页面:用
requests获取页面内容,BeautifulSoup指定解析器解析HTML。 - 定位目标行:如果是个人页面,直接遍历表格行;如果是球队页面,才需要匹配球员名字对应的行。
- 提取目标数据:通过整数索引对应列的位置,或通过列的
data-stat属性精准定位(更可靠)。
三、修正后的可运行代码
import requests from bs4 import BeautifulSoup # Jimmy Butler的个人数据页面 url = "https://www.basketball-reference.com/players/b/butleji01.html" # 发送请求并解析页面 response = requests.get(url) soup = BeautifulSoup(response.content, "html.parser") # 定位场均数据表格 per_game_table = soup.find("table", id="per_game") if not per_game_table: print("场均数据表格未找到") exit() # 遍历赛季行,提取2022-23赛季的数据(可根据需求修改赛季) target_row = None for row in per_game_table.find("tbody").find_all("tr"): # 跳过空的分隔行 if not row.find("td"): continue # 获取赛季名称 season = row.find("th").text.strip() if season == "2022-23": target_row = row break if target_row: # 方式1:通过data-stat属性精准提取数据(推荐,不受列顺序变化影响) pts = target_row.find("td", {"data-stat": "pts"}).text ast = target_row.find("td", {"data-stat": "ast"}).text fg_pct = target_row.find("td", {"data-stat": "fg_pct"}).text ft_pct = target_row.find("td", {"data-stat": "ft_pct"}).text # 存储并打印数据 jimmy_stats = { "场均得分(PTS)": pts, "场均助攻(AST)": ast, "投篮命中率(FG%)": fg_pct, "罚球命中率(FT%)": ft_pct } print("Jimmy Butler 2022-23赛季场均数据:") for stat_name, value in jimmy_stats.items(): print(f"{stat_name}: {value}") else: print("目标赛季数据未找到")
额外说明
- 推荐用
data-stat属性提取数据:表格的每个<td>都有data-stat属性(如data-stat="pts"对应得分),这种方式不受表格列顺序调整的影响,比索引更稳定。 - 若要提取其他迈阿密本土球队球员数据,只需替换URL为对应球员的个人页面,或在球队页面中通过匹配球员名字所在的行来提取。
内容的提问来源于stack exchange,提问作者Nick R
相关产品推荐
相关产品推荐

