Python网页爬取NHL数据异常:循环范围误作用于行而非页面
问题根源分析
你的循环逻辑本身是正确遍历18个页面的(range(1,19)对应page=1到page=18),但你没有遍历每个页面表格内的所有数据行,反而每次只抓取了当前页面表格的第一行数据——这才导致你误以为循环范围作用在了数据行上,而不是网页页面。
具体来说,你的代码里用了table.find(...)方法:这个方法只会返回匹配到的第一个元素,也就是表格第一行的球员和球队信息。循环18次后,你得到的是18个页面各一行的数据,而不是每个页面的所有球员数据。
修正后的代码
这里是修复后的完整代码,核心是添加了对表格数据行的遍历,同时保留了页面循环:
import requests from bs4 import BeautifulSoup import pandas as pd empty_list = [] # 遍历1到18页(range(1,19)生成1-18的整数) for page_num in range(1, 19): url = f"https://www.foxsports.com/nhl/stats?season=2017&category=SCORING&group=1&sort=3&time=0&pos=0&team=0&qual=1&sortOrder=0&page={page_num}" response = requests.get(url) # 如果请求失败,跳过当前页面 if not response.ok: print(f"请求页面{page_num}失败,跳过") continue soup = BeautifulSoup(response.text, 'lxml') table = soup.find('table', {'class': 'wisbb_standardTable'}) # 确保找到表格后再处理,避免报错 if not table: print(f"页面{page_num}未找到目标表格,跳过") continue # 获取表格的所有数据行(tbody里的行是实际数据,跳过表头) data_rows = table.find('tbody').find_all('tr') # 遍历当前页面的每一行数据 for row in data_rows: # 提取球员名,添加异常处理避免个别行结构异常导致报错 try: player = row.find('a', {'class': 'wisbb_fullPlayer'}).find('span').text.strip() team = row.find('span', {'class': 'wisbb_tableAbbrevLink'}).find('a').text.strip() empty_list.append((player, team)) except AttributeError: print(f"页面{page_num}某行数据提取失败,跳过该行") continue # 生成DataFrame df = pd.DataFrame(empty_list, columns=["player", "team"]) print(df.head())
关键修改点说明
- 把
find()改成find_all()来获取所有数据行,然后遍历每一行提取信息 - 添加了多层异常处理:检查请求是否成功、检查表格是否存在、处理个别行结构异常的情况,避免脚本中途崩溃
- 用
strip()去除文本前后的空白字符,让数据更整洁 - 把循环变量名从
i改成page_num,让代码可读性更强,明确这是页面编号
这样修改后,脚本会遍历18个页面的每一行数据,最终得到所有球员的信息,而不是每个页面只取第一行。
内容的提问来源于stack exchange,提问作者Joseph K
相关产品推荐
相关产品推荐

