如何用BeautifulSoup定位<p>类抓取微软SEC 10-K利润表?
解决微软10-K利润表抓取问题
问题原因
你用soup.find('p', string='INCOME STATEMENTS ')失败,核心是精确字符串匹配不兼容页面文本的格式差异:目标页面里的利润表标题可能没有末尾空格,或者存在换行、多空格/缩进,导致精确匹配无法命中。
修复方案:正则匹配定位标题
改用正则表达式模糊匹配标题文本,兼容格式差异,代码修改如下:
from bs4 import BeautifulSoup import requests import re # 导入正则模块 headers = {"User-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"} base_url = "https://www.sec.gov/Archives/edgar/data/789019/000156459018019062/msft-10k_20180630.htm" edgar_resp = requests.get(base_url, headers=headers) edgar_str = edgar_resp.text soup = BeautifulSoup(edgar_str, 'html.parser') # 用正则匹配标题,忽略大小写和前后空格 s = soup.find('p', recursive=True, text=re.compile(r'INCOME STATEMENTS', re.IGNORECASE)) if s: # 增加判断避免找不到时报错 t = s.find_next('table') trs = t.find_all('tr') for tr in trs: if tr.text.strip(): # 更严格的空行过滤 print(list(tr.stripped_strings)) else: print("未找到利润表标题")
更优方案:直接定位特征表格
如果标题定位不稳定,可通过表格内的特征关键词(如"Net Income"、"Revenue")直接筛选表格:
from bs4 import BeautifulSoup import requests headers = {"User-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"} base_url = "https://www.sec.gov/Archives/edgar/data/789019/000156459018019062/msft-10k_20180630.htm" edgar_resp = requests.get(base_url, headers=headers) edgar_str = edgar_resp.text soup = BeautifulSoup(edgar_str, 'html.parser') all_tables = soup.find_all('table') # 遍历所有表格,筛选包含利润表特征关键词的表格 for table in all_tables: table_text = table.get_text() if "Net Income" in table_text and "Revenue" in table_text: trs = table.find_all('tr') for tr in trs: if tr.text.strip(): print(list(tr.stripped_strings)) break # 找到第一个匹配的利润表后停止遍历
额外建议
SEC EDGAR提供结构化的XBRL数据,比直接解析HTML更稳定。你可以通过目标10-K页面的"Interactive Data"入口获取标准化的财务报表数据,但如果坚持解析HTML,上述两种方法足以解决当前问题。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

