基于BeautifulSoup的关键词匹配表格数据爬取问题求助
问题与修复方案
需求
从指定SEC归档文件中爬取表格数据,提取**同时满足行标题为“Cash and cash equivalent”/“Cash”、列标题包含“2020”**的数值,最终导出至Excel文件。
原代码问题分析
- 变量名冲突:将请求头的
headers与表格表头的headers重名,导致请求头被覆盖 - 表头处理错误:
- 错误使用
tr[0]提取表头,正确方式应为tr.find_all("th") - 对表头文本进行
encode("utf-8")转成字节类型,无法直接与字符串'2020'比较
- 错误使用
- 行与表头逻辑错位:在同一行同时查找
<td>数据和<th>表头,实际表头行仅含<th>,数据行仅含<td>,需分开处理 - 字符串拼接错误:直接将列表类型的表头与字符串拼接,会触发类型错误
修正后的代码
from bs4 import BeautifulSoup import requests import time import pandas as pd # 请求头(避免变量名冲突,改为request_headers) request_headers = {'User-Agent': 'registr@jh.edu'} urls = [ 'https://www.sec.gov/Archives/edgar/data/1127993/0001091818-21-000003.txt', 'https://www.sec.gov/Archives/edgar/data/1058307/0001493152-21-003451.txt' ] # 存储结果的列表,每个元素是字典,方便后续转DataFrame cash_results = [] for url in urls: response = requests.get(url, headers=request_headers) response.raise_for_status() time.sleep(0.1) soup = BeautifulSoup(response.text, 'lxml') for table in soup.find_all('table'): # 先找表头行,记录2020所在的列索引 target_col_idx = None rows = table.find_all('tr') for tr in rows: th_list = tr.find_all('th') if th_list: # 提取表头文本,清理空格 headers = [th.get_text(strip=True) for th in th_list] # 查找包含2020的列索引(支持模糊匹配) for idx, header in enumerate(headers): if '2020' in header: target_col_idx = idx break # 找到目标列后跳出表头循环 if target_col_idx is not None: break # 如果找到目标列,再遍历数据行找目标行标题 if target_col_idx is not None: for tr in rows: td_list = tr.find_all('td') if td_list: row_texts = [td.get_text(strip=True) for td in td_list] row_title = row_texts[0] if len(row_texts) > 0 else '' if row_title in ['Cash and cash equivalent', 'Cash']: if len(row_texts) > target_col_idx: cash_value = row_texts[target_col_idx] cash_results.append({ 'URL': url, 'Row Title': row_title, '2020 Value': cash_value }) # 将结果导出到Excel if cash_results: df = pd.DataFrame(cash_results) df.to_excel('cash_2020_results.xlsx', index=False) print("数据已成功导出到cash_2020_results.xlsx") else: print("未找到符合条件的数据")
代码说明
- 分离请求头与表格表头的变量名,避免冲突
- 先遍历表格定位含2020的列索引,再针对性提取目标行的对应列数值
- 支持模糊匹配表头中的2020(适配SEC文件中常见的日期格式)
- 结果存储为字典列表,直接转成DataFrame导出到Excel,满足后续需求
内容的提问来源于stack exchange,提问作者Candice LE
相关产品推荐
相关产品推荐

