如何用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')
关键说明
- URL拼接:使用
urljoin处理相对路径,避免手动拼接时出现域名重复、路径错误的问题。 - 时间提取:直接定位
<b>标签获取赛事时间,比拆分文本更精准,避免因文本格式变化导致的错误。 - 关联场地信息:通过
zip将场地名称、赛道状况与对应赛事绑定,确保每条赛事数据都包含所属场地的信息。 - 数据结构化:用字典存储单条赛事数据,统一存入列表后再转换为DataFrame,符合Pandas的最佳实践。
内容的提问来源于stack exchange,提问作者MattTT
相关产品推荐
相关产品推荐

