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

使用Python提取HTML表格数据并保存为pandas DataFrame的相关问题

解决方案

核心思路是直接遍历表格的DOM节点逐行提取,既可以拿到第一列的URL,也能保证其余字段数据完整,避免read_html带来的NaN问题。

完整修改代码

import pandas as pd
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 初始化browser(你之前的browser初始化代码保留在这里)
browser = webdriver.Chrome() # 这里根据你的实际驱动配置修改

def extraction():
    print("Program started Successfully!")
    websites = ["https://www.spacresearch.com/symbol?s=live-deal&sector=&geography="]
    # 最终存储数据的列表
    all_data = []
    # 定义列名(去掉首列SPAC,新增spac_url,其余列和原表格一致)
    columns = ["spac_url", "Target", "Ticker", "Announced", "Deadline", "TEV ($M)", "TEV/IPO", "Sector", "Geography", "Premium", "Common", "Warrant"]
    
    for live_deals in websites:
        browser.get(live_deals)
        wait = WebDriverWait(browser, 10)
        # 登录逻辑保持不变
        wait.until(EC.element_to_be_clickable((By.XPATH, "(//input[@id='username'])[2]"))).send_keys("kys")
        wait.until(EC.element_to_be_clickable((By.XPATH, "(//input[@id='password'])[2]"))).send_keys("pasd")
        wait.until(EC.element_to_be_clickable((By.XPATH, "(//button[text()='Next'])[2]"))).click()
        time.sleep(2)
        
        # 定位表格所有行
        table_rows = browser.find_elements(By.XPATH, "//table[@id='companies-table-deal-announced']/tbody/tr")
        for row in table_rows:
            row_data = []
            # 提取第一列的SPAC链接
            try:
                spac_url = row.find_element(By.CLASS_NAME, "ellipsis").find_element(By.TAG_NAME, "a").get_attribute("href")
                row_data.append(spac_url)
            except:
                row_data.append(None) # 异常情况填充空值
            
            # 提取剩余11列的内容
            tds = row.find_elements(By.TAG_NAME, "td")[1:] # 跳过第一列
            for td in tds:
                row_data.append(td.text.strip())
            
            # 确保每行数据长度和列名一致再添加
            if len(row_data) == len(columns):
                all_data.append(row_data)
        
        # 转为DataFrame
        df = pd.DataFrame(all_data, columns=columns)
        # 可以在这里执行df.to_csv()等保存操作
        print(df.head())
        print("Program Ended successfully!")
        return df

df = extraction()

注意事项

  • 如果你使用的是Selenium 3.x版本,把find_elements(By.xxx, 路径)替换为旧版的find_elements_by_xxx方法即可
  • 代码里增加了异常处理,避免个别行无链接时程序崩溃
  • 该方法直接从DOM节点取数,不会出现read_html的列值缺失问题,同时能保留第一列的URL

备选方案(基于你已拿到的文本处理)

如果你不想调整DOM遍历逻辑,也可以对已获取的文本做拆分处理,和你已经提取的URL列表按顺序拼接即可:

# 假设你已经拿到了文本变量text,以及URL列表spac_urls
lines = [line.strip() for line in text.split("\n") if line.strip()]
# 前12行是表头,从第12行开始是数据
data_lines = lines[12:]
# 数据行规律:奇数索引行是SPAC名(忽略),偶数索引行是字段值
row_values = [line.split() for idx, line in enumerate(data_lines) if idx % 2 ==1]
# 拼接URL和值
all_data = [[spac_urls[i]] + row_values[i] for i in range(len(spac_urls))]
columns = ["spac_url"] + lines[1:12]
df = pd.DataFrame(all_data, columns=columns)

该方案仅适用于所有字段不含空格的场景,稳定性低于DOM遍历方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:24:04