如何使用Python爬取SEC EDGAR 10-K动态XBRL业务分部销售表格
问题根因
- 现有代码仅请求了EDGAR的公司申报搜索结果页,没有实际请求目标10-K的文档地址
- 你提到的
https://www.sec.gov/ix?doc=/Archives/xxx是交互式XBRL渲染页,核心数据由前端JS动态生成,直接用requests拉取静态HTML无法拿到动态加载的dynamic-xbrl-form节点内容,直接请求ix?doc=后缀的原始HTML文档地址即可解决该问题 - SEC有反爬机制,未携带合法User-Agent的请求会被403拦截,无法获取正确的页面内容
可行实现代码
from bs4 import BeautifulSoup import requests # 必须配置合法User-Agent,否则会被SEC拦截 HEADERS = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } # 第一步:获取搜索页内容,定位目标10-K的文档入口 cik = '200406' doc_type = '10-K' dateb = '20210704' base_url = "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK={}&type={}&dateb={}" search_resp = requests.get(base_url.format(cik, doc_type, dateb), headers=HEADERS) search_soup = BeautifulSoup(search_resp.text, 'html.parser') # 定位10-K对应的documents按钮跳转链接 doc_list_link = search_soup.find(id='documentsbutton')['href'] doc_list_url = f"https://www.sec.gov{doc_list_link}" # 第二步:进入文档列表页,获取10-K的原始HTML地址 doc_list_resp = requests.get(doc_list_url, headers=HEADERS) doc_list_soup = BeautifulSoup(doc_list_resp.text, 'html.parser') # 原始10-K文档在文件表格的第二行 raw_doc_link = doc_list_soup.find('table', class_='tableFile').find_all('tr')[1].find('a')['href'] raw_doc_url = f"https://www.sec.gov{raw_doc_link}" # 第三步:请求原始HTML,提取目标表格 raw_resp = requests.get(raw_doc_url, headers=HEADERS) raw_soup = BeautifulSoup(raw_resp.text, 'html.parser') # 按表格内文本匹配定位「Sales By Segment Of Business」表格 target_table = None for table in raw_soup.find_all('table'): if 'Sales By Segment Of Business' in table.get_text(strip=True): target_table = table break # 输出结果 if target_table: # 可按需将表格转换为DataFrame、CSV等格式 print(target_table.prettify()) else: print("未找到目标业务分部销售额表格")
优化建议
如果需要更高的定位准确率,可以配合XBRL标签属性筛选,或者匹配表格内的固定字段(如Segment、Net Sales等关键字)减少误判。批量处理10-K文件时,可直接调用成熟的EDGAR解析工具简化流程。
内容的提问来源于stack exchange,提问作者Tarun teja
相关产品推荐
相关产品推荐

