我正在尝试使用 Python 的 BeautifulSoup 或 HTMLParser 从 SEC EDGAR 系统上的 10-K 报告(例如公司的代理报告)中提取“仅”文本信息。然而,我使用的解析器似乎不能很好地处理“txt”格式的文件,包括大量无意义的符号和标签以及一些根本不需要的 xbrl 信息。但是,当我将解析器直接应用于“htm”格式文件时(这些文件或多或少没有无意义标签的问题),解析器似乎工作得相对良好。
"""for Python 3, from urllib.request import urlopen"""
from urllib2 import urlopen
from bs4 import BeautifulSoup
"""for extracting text data only from txt format"""
txt = urlopen("https://www.sec.gov/Archives/edgar/data/1660156/000166015616000019/0001660156-16-000019.txt")
bs_txt = BeautifulSoup(txt.read())
bs_txt_text = bs_txt.get_text()
len(bs_txt_text) # 400051
"""for extracting text data only from htm format"""
html = urlopen("https://www.sec.gov/Archives/edgar/data/1660156/000166015616000019/f201510kzec2_10k.htm")
bs_html = BeautifulSoup(html.read())
bs_html_text = bs_html.get_text()
len(bs_html_text) # 98042
但问题是我只能依赖“txt”格式的文件,而不是“htm”格式的文件,所以我的问题是,有什么方法可以处理从文件中删除所有无意义的符号和标签吗?文件并仅提取文本信息,就像直接从“htm”文件中提取的信息一样?我对使用 Python 进行解析还比较陌生,所以如果你对此有任何想法,那将会有很大的帮助。预先感谢您!
最佳答案
处理 XBRL 数据的最佳方法是使用 XBRL 处理器,例如开源 Arelle (注意:我与他们没有任何关系)或其他专有引擎。
然后您可以以更高的抽象级别查看数据。就 XBRL 数据模型而言,您在问题中描述的过程涉及
- 在分类中查找文本 block (
textBlockItemType
) 的概念; - 检索实例中针对这些概念所报告的事实的值(value);
- 此外,获取一些相关元信息:谁(报告实体)、时间(XBRL 周期)、文本内容(概念元数据和文档)等。
XBRL 处理器将为您节省解析整个 DTS 以及处理低级语法复杂性的精力。
第二种最合适的方法是使用 XML 解析器,可能使用 XML Schema 引擎以及 XQuery 或 XSLT,但这需要更多的工作,因为您需要:
- 查看 XML 架构(XBRL 分类架构)文件,递归地导航它们并查找文本 block 概念,处理命名空间、链接等(XBRL 处理器会阻止您处理这些内容)
- 或者只查看实例,最好是 XML 文件(例如 https://www.sec.gov/Archives/edgar/data/1660156/000166015616000019/zeci-20151231.xml ),并进行一些修改(例如获取以
TextBlock
结尾的 XML 元素),但这是您自己承担风险,不建议这样做,因为这会绕过分类法。
最后,正如您在原始问题中所建议的那样,您还可以查看文档格式文件(HTML 等),而不是查看 SEC 备案的数据文件,但是在这种情况下,它违背了使用 XBRL 的目的,这是通过标签和上下文使数据可以被计算机理解,并且它可能会错过与文本相关的重要上下文信息 - 有点像使用文本/十六进制编辑器打开电子表格文件。
当然,有些用例可以证明使用最后一种方法是合理的,例如运行自然语言处理算法。我想说的是,这超出了 XBRL 的范围。
关于python - 如何从html文件中删除所有不必要的标签和符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43858278/