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)
关键改动说明
- 列表初始化位置调整:把
rider_rank_list = []移到赛段循环外部,确保所有赛段的数据都能被累积保存。 - 循环缩进修正:将遍历车手的
for i循环缩进在赛段循环内部,每个赛段的HTML解析结果都会被用来提取对应车手的数据。 - 选择器简化:替换冗长的绝对路径选择器为相对选择器,提升代码稳定性,避免页面结构小变动导致选择器失效。
- 异常防护:增加
if results and rrank判断,防止某个赛段不足10名车手时出现AttributeError。
内容的提问来源于stack exchange,提问作者mgd6
相关产品推荐
相关产品推荐

