如何从html文件中删除所有不必要的标签和标志?

时间:2017-05-08 22:34:45

标签: python html parsing beautifulsoup xbrl

我试图通过使用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解析相对较新,所以如果您对此有任何想法,那将会有很大的帮助。提前谢谢!

2 个答案:

答案 0 :(得分:1)

处理XBRL数据的最佳方法是使用XBRL处理器,例如开源Arelle(注意:我与它们没有联系)或其他专有引擎。

然后,您可以使用更高级别的抽象来查看数据。就XBRL数据模型而言,您在问题中描述的过程涉及

  1. 在分类中寻找文本块(textBlockItemType)的概念;
  2. 检索实例中针对这些概念报告的事实的值;
  3. 另外,获取一些关于它的元信息:谁(报告实体),何时(XBRL期间),文本是什么(概念元数据和文档)等。
  4. XBRL处理器将为您节省解决整个DTS的工作量以及处理低级语法的复杂性。

    第二种最合适的方法是使用XML解析器,可能使用XML Schema引擎以及XQuery或XSLT,但这需要更多的工作,因为您需要:

    • 查看XML Schema(XBRL分类模式)文件,递归导航它们并查找文本块概念,处理命名空间,链接等(XBRL处理器为您提供保护)
    • 或者只查看实例,理想情况下是XML文件(例如,https://www.sec.gov/Archives/edgar/data/1660156/000166015616000019/zeci-20151231.xml),其中包含一些黑客攻击(例如以TextBlock结尾的XML元素),但这是自己承担风险而不推荐,因为这会绕过分类法。

    最后,正如您在原始问题中所建议的那样,您还可以查看文档格式文件(HTML等)而不是SEC文件的数据文件,但在这种情况下,它会破坏使用XBRL的目的由于标签和上下文,计算机可以理解数据,并且它可能会遗漏与文本相关的重要上下文信息 - 有点像用文本/十六进制编辑器打开电子表格文件。

    当然,有些用例可以证明使用最后一种方法是合理的,例如运行自然语言处理算法。我要说的是,这超出了XBRL的范围。

答案 1 :(得分:0)

在pyparsing wiki示例页面上有一个HTML tag stripper。它不会尝试构建HTML文档,它只是查找HTML和脚本标记并将其剥离。