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

Python遍历环西2022赛段URL仅获最后段数据的问题求助

问题分析与解决方案

核心问题

你的代码存在两个关键逻辑错误:

  • rider_rank_list = [] 被放在赛段循环内部,导致每次遍历新赛段时都会清空列表,之前的赛段数据全部丢失。
  • 遍历车手的for i循环未缩进在赛段循环内,仅会用最后一个赛段的soup对象提取数据,自然只能拿到最后一个赛段的结果。

修复后的代码

import requests
from bs4 import BeautifulSoup
import pandas as pd

# 初始化列表在循环外部,确保数据能累积存储
rider_rank_list = []

for j in range(1, 10):
    url = f"https://www.lavuelta.es/en/rankings/stage-{j}"
    page = requests.get(url)
    urlt = page.content
    soup = BeautifulSoup(urlt, "html.parser")  # 指定解析器更规范
    
    # 将车手循环缩进,每个赛段都执行一次数据提取
    for i in range(1, 11):
        # 简化选择器,避免绝对路径的脆弱性
        rider_selector = f"tbody tr:nth-child({i}) td.runner.is-sticky a"
        rank_selector = f"tbody tr:nth-child({i}) td:nth-child(1)"
        
        results = soup.select_one(rider_selector)
        rrank = soup.select_one(rank_selector)
        
        # 增加判断,避免找不到元素时报错
        if results and rrank:
            stage = str.title(url.rsplit('/', 1)[-1]).replace('-', ' ')
            rider_rank_list.append((stage, results.text.strip(), rrank.text.strip()))

print(rider_rank_list)
df = pd.DataFrame(rider_rank_list, columns=['stage','rider','rank'])
print(df)

df.to_csv('data.csv', index=False)

关键改动说明

  1. 列表初始化位置调整:把rider_rank_list = []移到赛段循环外部,确保所有赛段的数据都能被累积保存。
  2. 循环缩进修正:将遍历车手的for i循环缩进在赛段循环内部,每个赛段的HTML解析结果都会被用来提取对应车手的数据。
  3. 选择器简化:替换冗长的绝对路径选择器为相对选择器,提升代码稳定性,避免页面结构小变动导致选择器失效。
  4. 异常防护:增加if results and rrank判断,防止某个赛段不足10名车手时出现AttributeError。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:10:49