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

Python Web Scraping循环异常:爬取F1官网仅返回单个结果

解决BeautifulSoup爬取F1官网仅返回单个结果的问题

我帮你分析下问题所在,你现在的代码只输出单个结果,核心原因是你遍历的对象不对:

问题根源

你的代码里,soup.find_all("div", class_="race-list")返回的是整个赛事列表的父容器(通常页面上只有一个race-list容器),所以for container in data只会循环一次。然后你在这个大容器里用find_all找所有span.name,却直接取了第一个元素[0],自然只能拿到第一个国家的名字。

修正后的代码

正确的做法是:先找到整个race-list容器,再遍历容器内的单个赛事条目,从每个条目里提取对应信息。我调整了代码,你可以参考:

import requests
from bs4 import BeautifulSoup
from csv import writer

page = requests.get("https://www.formula1.com/")
soup = BeautifulSoup(page.content, 'html.parser')

# 先定位到整个赛事列表的父容器
race_list_container = soup.find("div", class_="race-list")
# 在父容器里找到所有单个赛事的条目(这里的类名需要根据页面实际结构调整,你可以右键检查页面元素确认)
race_items = race_list_container.find_all("div", class_="race-item")

for item in race_items:
    # 从每个赛事条目里提取信息,用find()替代find_all()更高效,因为每个条目里只有一个对应元素
    country = item.find("span", class_="name").text.strip()
    racetype = item.find("span", class_="race-type").text.strip()
    racetime = item.find("time", class_="day").text.replace("\n", "").strip()
    
    print(country)

关键调整点

  1. 遍历对象从父容器改为单个赛事条目:原来的循环只跑一次,现在会遍历每个赛事条目,自然能输出所有国家。
  2. 用find()替代find_all()[0]:每个赛事条目里只有一个name/race-type/day元素,直接用find()获取第一个匹配项更简洁高效,避免索引错误。

如果运行后还是有问题,记得右键打开F1官网的开发者工具,检查单个赛事条目的实际类名(比如可能是EventListItem或者其他),替换代码里的race-item即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:46:08