使用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§or=&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
相关产品推荐
相关产品推荐

