基于Selenium与Python的网站表格爬取:解决线性输出转结构化表格问题
解决Selenium爬取表格数据并转为DataFrame导出Excel的问题
嗨,作为Python新手能走到这一步已经很棒了!你现在的问题是直接获取了表格的纯文本内容,没有保留结构化的列信息,而且有些字段(比如Tip列的Clipsham Gold)包含空格,直接拆分文本会把它们拆成多个元素,导致数据混乱。咱们可以通过直接解析表格的HTML结构来解决这个问题,具体步骤如下:
核心思路
- 从网页的表格元素中逐行逐单元格提取数据,而不是拿整个文本块,这样能准确保留每列的结构。
- 把所有页面的表格数据收集到一个统一的列表中。
- 将列表转换为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
相关产品推荐
相关产品推荐

