bor*_*amp 15 python xml sgml lxml python-3.x
我试图解析一个文件,如:http: //www.sec.gov/Archives/edgar/data/1409896/000118143112051484/0001181431-12-051484.hdr.sgml
我正在使用Python 3,并且无法找到现有库的解决方案来解析带有开放标记的SGML文件.SGML允许隐式封闭标签.当试图用LXML,XML或美丽的汤解析示例文件时,我最终会在文件的末尾而不是在行的末尾关闭隐式封闭的标签.
例如:
<COMPANY>Awesome Corp
<FORM> 24-7
<ADDRESS>
<STREET>101 PARSNIP LN
<ZIP>31337
</ADDRESS>
Run Code Online (Sandbox Code Playgroud)
这最终被解释为:
<COMPANY>Awesome Corp
<FORM> 24-7
<ADDRESS>
<STREET>101 PARSNIP LN
<ZIP>31337
</ADDRESS>
</ZIP>
</STREET>
</FORM>
</COMPANY>
Run Code Online (Sandbox Code Playgroud)
但是,我需要将其解释为:
<COMPANY>Awesome Corp</COMPANY>
<FORM> 24-7</FORM>
<ADDRESS>
<STREET>101 PARSNIP LN</STREET>
<ZIP>31337</ZIP>
</ADDRESS>
Run Code Online (Sandbox Code Playgroud)
如果有一个非默认解析器传递给LXML/BS4可以处理这个,我就错过了它.
如果您可以为您使用的文档找到 SGML DTD,那么解决方案可能是使用OpenSP SGML 工具包中的osx SGML 到 XML 转换器将文档转换为 XML。
这是一个简单的例子。假设我们有以下 SGML 文档(company.sgml;带有根元素):
<!DOCTYPE ROOT SYSTEM "company.dtd">
<ROOT>
<COMPANY>Awesome Corp
<FORM> 24-7
<ADDRESS>
<STREET>101 PARSNIP LN
<ZIP>31337
</ADDRESS>
Run Code Online (Sandbox Code Playgroud)
DTD (company.dtd) 如下所示:
<!ELEMENT ROOT - o (COMPANY, FORM, ADDRESS) >
<!ELEMENT COMPANY - o (#PCDATA) >
<!ELEMENT FORM - o (#PCDATA) >
<!ELEMENT ADDRESS - - (STREET, ZIP) >
<!ELEMENT STREET - o (#PCDATA) >
<!ELEMENT ZIP - o (#PCDATA) >
Run Code Online (Sandbox Code Playgroud)
该- o
位表示可以省略结束标记。
SGML 文档可以用osx解析,输出可以用xmllint格式化,如下:
osx company.sgml | xmllint --format -
Run Code Online (Sandbox Code Playgroud)
上述命令的输出:
<?xml version="1.0"?>
<ROOT>
<COMPANY>Awesome Corp</COMPANY>
<FORM> 24-7</FORM>
<ADDRESS>
<STREET>101 PARSNIP LN</STREET>
<ZIP>31337</ZIP>
</ADDRESS>
</ROOT>
Run Code Online (Sandbox Code Playgroud)
现在我们有了可以用 lxml 或其他 XML 工具处理的格式良好的 XML。
我不知道您链接到的文档是否有完整的 DTD。以下 PDF 文件包含有关 EDGAR 的相关信息,包括可能有用的 DTD:http : //www.sec.gov/info/edgar/pdsdissemspec910.pdf(我通过这个答案找到了它)。但链接的 SGML 文档包含SEC-HEADER
PDF 文件中未提及的元素(例如)。