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

基于Selenium与Python的网站表格爬取:解决线性输出转结构化表格问题

解决Selenium爬取表格数据并转为DataFrame导出Excel的问题

嗨,作为Python新手能走到这一步已经很棒了!你现在的问题是直接获取了表格的纯文本内容,没有保留结构化的列信息,而且有些字段(比如Tip列的Clipsham Gold)包含空格,直接拆分文本会把它们拆成多个元素,导致数据混乱。咱们可以通过直接解析表格的HTML结构来解决这个问题,具体步骤如下:

核心思路

  1. 从网页的表格元素中逐行逐单元格提取数据,而不是拿整个文本块,这样能准确保留每列的结构。
  2. 把所有页面的表格数据收集到一个统一的列表中。
  3. 将列表转换为Pandas DataFrame,最后导出为Excel文件。

修改后的完整代码

import datetime
import pandas as pd
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager

chrome_options = Options()
chrome_options.add_experimental_option("prefs",{'profile.managed_default_content_settings.javascript': 2})
chrome_options.add_argument("-headless")
# 用webdriver-manager自动管理驱动,避免手动指定路径的麻烦
chrome = webdriver.Chrome(ChromeDriverManager().install(), options=chrome_options)

today = datetime.date.today()
first = today.replace(day=1)
lastMonth = first - datetime.timedelta(days=1)
date_range = pd.date_range(start='2019-01-01', end=lastMonth, freq='MS')
date_list = [i.strftime('%B/%Y') for i in date_range]

base_url = "https://www.horseracing.net/tipsters/sky-sports-racing/alex-hammond/"
length = len(date_list)
# 用来存储所有页面的表格数据
all_data = []

i = 41 # 测试用的起始索引,后续可以改成0遍历全部
while i < length:
    page_url = f"{base_url}{date_list[i]}"
    chrome.get(page_url)
    time.sleep(1) # 加个短延迟确保页面加载完成,避免元素未找到报错
    
    # 定位表格容器内的表格,再获取所有行元素
    table = chrome.find_element(By.CSS_SELECTOR, '.main-table-container table')
    rows = table.find_elements(By.TAG_NAME, 'tr')
    
    # 提取表头(第一行的th标签内容)
    headers = [header.text.strip() for header in rows[0].find_elements(By.TAG_NAME, 'th')]
    
    # 遍历数据行(从第二行开始,跳过表头)
    for row in rows[1:]:
        cells = row.find_elements(By.TAG_NAME, 'td')
        # 把每行的单元格内容和表头对应,存成字典
        row_data = {headers[j]: cells[j].text.strip() for j in range(len(headers))}
        # 额外加上当前页面的月份信息,方便后续筛选分析
        row_data['Month/Year'] = date_list[i]
        all_data.append(row_data)
    
    i += 1

# 关闭浏览器释放资源
chrome.quit()

# 把收集到的所有数据转成DataFrame
df = pd.DataFrame(all_data)
# 导出为Excel文件,index=False去掉默认的索引列
df.to_excel('horse_racing_tips.xlsx', index=False)

print("数据已成功导出到horse_racing_tips.xlsx!")

关键改动说明

  • 改用表格元素解析:不再直接获取纯文本,而是通过table、tr、th/td标签精准提取每一行每一列的内容,完美保留原表格的结构,彻底解决空格拆分字段的问题。
  • 统一收集数据:用all_data列表存储每个页面的行数据字典,最后一次性转成DataFrame,保证数据的完整性。
  • 添加加载延迟:加入time.sleep(1)避免页面未加载完成就提取元素,降低报错概率。
  • 自动管理驱动:用ChromeDriverManager().install()替代手动指定驱动路径,适配不同系统和Chrome版本。
  • 补充月份字段:把当前页面的Month/Year加到每行数据中,方便后续分析不同月份的赛马贴士数据。

运行这段代码后,你就能得到一个和网页表格结构完全一致的Excel文件啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 19:44:06