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

基于BeautifulSoup的关键词匹配表格数据爬取问题求助

问题与修复方案

需求

从指定SEC归档文件中爬取表格数据,提取**同时满足行标题为“Cash and cash equivalent”/“Cash”、列标题包含“2020”**的数值,最终导出至Excel文件。

原代码问题分析

  1. 变量名冲突:将请求头的headers与表格表头的headers重名,导致请求头被覆盖
  2. 表头处理错误:
    • 错误使用tr[0]提取表头,正确方式应为tr.find_all("th")
    • 对表头文本进行encode("utf-8")转成字节类型,无法直接与字符串'2020'比较
  3. 行与表头逻辑错位:在同一行同时查找<td>数据和<th>表头,实际表头行仅含<th>,数据行仅含<td>,需分开处理
  4. 字符串拼接错误:直接将列表类型的表头与字符串拼接,会触发类型错误

修正后的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:24:25