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

爬取Capitol Trades国会股票交易数据,如何处理被pandas移除的span标签?

解决方案

方法1:修改HTML结构,给span标签添加分隔符

在调用pd.read_html前,通过BeautifulSoup修改表格内的span标签,给其内容前后添加空格,让pandas解析时自动区分公司名与股票代码,后续再拆分列即可。

修改后的完整代码:

import pandas as pd
import yfinance as yf
from selenium import webdriver
from bs4 import BeautifulSoup
import time
import datetime

def get_url(page=1, pageSize=50, assetType='stock'):
    if page == 1:
        return f'https://www.capitoltrades.com/trades?assetType={assetType}&pageSize={pageSize}'
    elif page > 1:
        return f'https://www.capitoltrades.com/trades?assetType={assetType}&page={page}&pageSize={pageSize}'
    else:
        return None

driver = webdriver.Firefox()
driver.get(get_url(page=1))
driver.implicitly_wait(10)
time.sleep(1)
soup = BeautifulSoup(driver.page_source, 'lxml')
tables = soup.find_all('table')

# 关键操作:遍历所有span标签,给代码前后加空格避免拼接
for table in tables:
    for span in table.find_all('span'):
        span.string = f' {span.get_text()} '

# 解析处理后的表格
df = pd.read_html(str(tables))[0]
# 拆分Asset列(根据实际列名调整),匹配末尾1-5位大写字母的股票代码
df[['Company Name', 'Ticker']] = df['Asset'].str.split(r'\s+(?=[A-Z]{1,5}$)', n=1, expand=True)
# 清理多余空格
df['Company Name'] = df['Company Name'].str.strip()
df['Ticker'] = df['Ticker'].str.strip()

driver.close()

方法2:手动遍历表格提取数据(精准控制)

直接用BeautifulSoup遍历表格行与单元格,分别提取公司名(span外文本)和股票代码(span内文本),完全避免自动解析的拼接问题。

代码示例:

import pandas as pd
import yfinance as yf
from selenium import webdriver
from bs4 import BeautifulSoup
import time
import datetime

def get_url(page=1, pageSize=50, assetType='stock'):
    if page == 1:
        return f'https://www.capitoltrades.com/trades?assetType={assetType}&pageSize={pageSize}'
    elif page > 1:
        return f'https://www.capitoltrades.com/trades?assetType={assetType}&page={page}&pageSize={pageSize}'
    else:
        return None

driver = webdriver.Firefox()
driver.get(get_url(page=1))
driver.implicitly_wait(10)
time.sleep(1)
soup = BeautifulSoup(driver.page_source, 'lxml')
table = soup.find('table')

# 提取表头并新增股票代码列
headers = [th.get_text(strip=True) for th in table.find('thead').find_all('th')]
asset_col_idx = headers.index('Asset')
headers.insert(asset_col_idx + 1, 'Ticker')

# 逐行提取数据
rows_data = []
for row in table.find('tbody').find_all('tr'):
    cells = row.find_all('td')
    row_data = []
    for cell in cells:
        if cell.get('data-label') == 'Asset':
            # 分别提取公司名和股票代码
            ticker = cell.find('span').get_text(strip=True)
            company_name = cell.get_text(strip=True).replace(ticker, '').strip()
            row_data.append(company_name)
            row_data.append(ticker)
        else:
            row_data.append(cell.get_text(strip=True))
    rows_data.append(row_data)

# 构建DataFrame
df = pd.DataFrame(rows_data, columns=headers)

driver.close()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:15:34