如何用Python读取10-K XBRL文件并分离文本与表格?
解决10-K XBRL文件标签间文本与表格分离问题
核心思路
既然已经锁定了两个<section>标签的范围,不用纠结整个文件的复杂结构,聚焦这个区间内的节点逐个判断即可,精准区分文本和表格元素。
用Python + BeautifulSoup实现的具体步骤
加载文件并定位目标
区间
先将文件载入BeautifulSoup,再根据文件实际属性(如id、class)定位目标标签: from bs4 import BeautifulSoup # 若为XML格式,将解析器替换为"lxml-xml" with open("your_10k_file.html", "r", encoding="utf-8") as f: soup = BeautifulSoup(f, "html.parser") # 替换为你文件中实际的<section>定位条件 section_start = soup.find("section", attrs={"id": "start_section"}) section_end = soup.find("section", attrs={"id": "end_section"})遍历区间节点,分离文本与表格
从起始的下一个节点开始遍历,直到碰到结束 ,按节点类型分类收集: collected_text = [] collected_tables = [] current_node = section_start.next_sibling while current_node != section_end: # 识别table标签,可选择存储HTML结构或转为结构化数据 if current_node.name == "table": collected_tables.append(str(current_node)) # 若需结构化表格数据,可添加以下代码: # import pandas as pd # table_df = pd.read_html(str(current_node))[0] # collected_tables.append(table_df) # 收集纯文本节点,过滤空内容 elif current_node.string and current_node.string.strip(): collected_text.append(current_node.string.strip()) # 收集嵌套在p、div等标签内的文本 elif current_node.name in ["p", "div", "span"]: clean_text = current_node.get_text(strip=True) if clean_text: collected_text.append(clean_text) # 跳过script、style等无关标签 elif current_node.name in ["script", "style"]: pass current_node = current_node.next_sibling # 合并收集到的文本内容 final_text = "\n".join(collected_text)关键注意点
- 若处理纯XBRL XML文件,必须使用
lxml-xml解析器,同时需处理XBRL的命名空间前缀 - 若表格带有特殊样式(如你截图中的高亮),可通过
current_node.get("class")匹配类名精准识别 - 遇到深层嵌套节点,可添加递归遍历子节点的逻辑,避免遗漏文本
- 若处理纯XBRL XML文件,必须使用
极端复杂结构的替代方案
如果BeautifulSoup仍无法处理,可尝试以下两种方法:
- 利用XBRL语义标签:10-K的XBRL文件带有标准化标签,直接用XPath查询表格相关元素:
import xml.etree.ElementTree as ET tree = ET.parse("your_10k_file.xml") root = tree.getroot() # 替换为你文件中的XBRL命名空间 ns_map = {"xbrl": "http://www.xbrl.org/2003/instance"} tables = root.findall(".//xbrl:table", ns_map) - 文本特征分割:将文件转为纯文本后,通过表格的典型特征(如大量
|分隔符、整齐行列结构)识别表格区域,再对应回的范围
内容的提问来源于stack exchange,提问作者Chandra
相关产品推荐
相关产品推荐

