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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:38:47