爬取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
相关产品推荐
相关产品推荐

