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)
关键调整点
- 遍历对象从父容器改为单个赛事条目:原来的循环只跑一次,现在会遍历每个赛事条目,自然能输出所有国家。
- 用
find()替代find_all()[0]:每个赛事条目里只有一个name/race-type/day元素,直接用find()获取第一个匹配项更简洁高效,避免索引错误。
如果运行后还是有问题,记得右键打开F1官网的开发者工具,检查单个赛事条目的实际类名(比如可能是EventListItem或者其他),替换代码里的race-item即可。
内容的提问来源于stack exchange,提问作者Kronos
相关产品推荐
相关产品推荐

