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

如何用BeautifulSoup提取列表内赛马赛事的指定信息?

解决方案:赛马赛事数据提取与DataFrame存储

核心修改思路

针对你已有的代码,需要嵌套遍历场地与赛事,解析每个赛事li元素内的标签内容,拼接完整URL后将所有字段存入列表,最终转换为DataFrame。

完整代码实现

from bs4 import BeautifulSoup
from urllib.parse import urljoin
import pandas as pd

# 读取本地HTML文件
HTMLFileToBeOpened = open("timeform.html", "r")
contents = HTMLFileToBeOpened.read()
beautifulSoupText = BeautifulSoup(contents, 'html.parser')

# 定位赛事容器
daily_racecard_info = beautifulSoupText.find(class_='w-racecard-grid-container widget-content widget-content-no-padding')
individual_course_racecard = daily_racecard_info.find_all(class_='w-racecard-grid-meeting')

# 提取场地名称与赛道状况
course_names = [item.find(class_='w-racecard-grid-course clickable').text.strip() for item in individual_course_racecard]
course_going = [item.find(class_='w-racecard-grid-info w-racecard-grid-info-going').text.strip() for item in individual_course_racecard]
goings_simple = [item.replace('Going', '').strip() for item in course_going]

# 根URL(用于拼接相对路径)
ROOT_URL = "https://www.timeform.com"
# 初始化存储所有赛事数据的列表
race_data = []

# 遍历每个场地的所有赛事
for course, going, races in zip(course_names, goings_simple, individual_course_racecard):
    # 获取当前场地的所有赛事li元素
    race_list = races.find_all('li', class_='w-racecard-grid-race-result')
    for race in race_list:
        # 提取赛事链接并拼接完整URL
        a_tag = race.find('a')
        full_url = urljoin(ROOT_URL, a_tag['href'])
        
        # 提取赛事时间(直接从b标签获取,避免文本拆分误差)
        race_time = race.find('b').text.strip()
        # 提取赛事类型(从第一个span中移除时间后得到)
        first_span = a_tag.find_all('span')[0]
        race_type = first_span.text.replace(race_time, '').strip()
        # 提取距离与级别
        race_distance = a_tag.find_all('span')[1].text.strip()
        race_level = a_tag.find_all('span')[2].text.strip()
        # 提取赛事完整标题(li的title属性)
        race_title = race['title']
        
        # 将当前赛事数据存入字典,再添加到列表
        race_data.append({
            '场地名称': course,
            '赛道状况': going,
            '赛事标题': race_title,
            '赛事时间': race_time,
            '赛事类型': race_type,
            '赛事距离': race_distance,
            '赛事级别': race_level,
            '完整链接': full_url
        })

# 转换为DataFrame
race_df = pd.DataFrame(race_data)
# 可选择打印或保存结果
print(race_df.head())
# race_df.to_csv("赛马赛事数据.csv", index=False, encoding='utf-8-sig')

关键说明

  1. URL拼接:使用urljoin处理相对路径,避免手动拼接时出现域名重复、路径错误的问题。
  2. 时间提取:直接定位<b>标签获取赛事时间,比拆分文本更精准,避免因文本格式变化导致的错误。
  3. 关联场地信息:通过zip将场地名称、赛道状况与对应赛事绑定,确保每条赛事数据都包含所属场地的信息。
  4. 数据结构化:用字典存储单条赛事数据,统一存入列表后再转换为DataFrame,符合Pandas的最佳实践。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:52:44