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

使用Python BeautifulSoup抓取SEC EDGAR 13F文件提取href链接问题

实现代码

你可以直接基于现有代码补充以下逻辑,完整可运行代码如下:

import requests
import time
from bs4 import BeautifulSoup

# 全局配置
headers = {"user-agent": 'Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0'}
SEC_BASE_DOMAIN = "https://www.sec.gov"
firms = ["IFP Advisors"] # 替换为你自己的投资公司列表

for firm in firms:
    edgar_url = fr'https://www.sec.gov/cgi-bin/srch-edgar?text=form-type%3D13F-HR+and+company-name+%3D+%22{firm}%22&first=2020&last=2021&output=atom'
    response = requests.get(url=edgar_url, headers=headers)
    # 检查请求是否成功,出错直接抛出异常避免后续无效处理
    response.raise_for_status()
    # 用XML解析器处理ATOM格式返回,节点定位更准确
    soup = BeautifulSoup(response.content, 'lxml-xml')
    entries = soup.find_all('entry')

    for entry in entries:
        try:
            # 提取link标签的href相对路径
            href_path = entry.find('link', rel='alternate')['href']
            # 拼接得到原始txt文件的可访问地址:替换index页后缀为txt
            txt_url = SEC_BASE_DOMAIN + href_path.replace("-index.htm", ".txt")
            print(f"公司{firm}的13F备案地址:{txt_url}")
            # 如需下载文件可直接请求该地址
            # file_content = requests.get(txt_url, headers=headers).text
        except (AttributeError, KeyError) as e:
            print(f"处理{firm}的备案条目失败,跳过当前条目:{str(e)}")
    # SEC有请求频率限制,添加1秒延迟避免被封IP
    time.sleep(1)

关键逻辑说明

  • 解析器调整:原代码用HTML解析器处理XML格式的ATOM返回,容易出现节点属性识别错误,替换为lxml-xml解析器后可以精准定位所有XML节点
  • 路径拼接规则:SEC返回的href为站点相对路径,直接和基础域名拼接即可得到可访问地址,不需要额外处理路径格式
  • 后缀替换逻辑:原href指向备案的索引网页,将末尾的-index.htm替换为.txt即可直接获取13F备案的原始文本文件,和你给出的示例地址规则完全匹配
  • 异常处理:针对可能出现的节点缺失、属性缺失问题增加捕获逻辑,避免单条数据异常导致整个爬取任务中断
  • 频率控制:添加秒级延迟适配SEC的反爬规则,避免IP被临时封禁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:24:05