我正在尝试分析一个文件,例如:
http://www.sec.gov/Archives/edgar/data/1409896/000118143112051484/0001181431-12-051484.hdr.sgml
我使用的是Python3,无法通过现有库找到解析带有open标记的SGML文件的解决方案。SGML允许隐式关闭标记。当试图用LXML、XML或beautiful-soup解析示例文件时,隐式关闭的标记在文件的末尾而不是行的末尾被关闭
例如:
<;公司>;真棒公司
<;表格>;24-7
<;地址>;
<;街道>;101欧防风
<;拉链>;31337
</地址>;
这最终被解释为:
<;公司>;真棒公司
<;表格>;24-7
<;地址>;
<;街道>;101欧防风
<;拉链>;31337
</地址>;
</拉链>;
</街道>;
</表格>;
</公司>;
但是,我需要将其解释为:
<;公司>;威盛公司</公司>;
<;表格>;24-7日</表格>;
<;地址>;
<;街道>;101欧防风LN</街道>;
<;拉链>;31337</拉链>;
</地址>;
如果要传递给LXML/BS4的非默认解析器可以处理这个问题,那么我就缺少它
如果您可以为您使用的文档找到SGML DTD,那么解决方案可能是使用OpenSP SGML工具包中的osxSGML-to-XML转换器将文档转换为XML
下面是一个简单的例子。假设我们有以下SGML文档(company.SGML;带有根元素):
<;!DOCTYPE根系统“company.dtd”>;
<;根>;
<;公司>;真棒公司
<;表格>;24-7
<;地址>;
<;街道>;101欧防风
<;拉链>;31337
</地址>;
DTD(company.DTD)如下所示:
<;!元素根-o(公司、表格、地址)>;
<;!元素公司-o(#PCDATA)>;
<;!元素形式-o(#PCDATA)>;
<;!元素地址---(街道、邮政编码)>;
<;!元素街-o(#PCDATA)>;
<;!元素ZIP-o(#PCDATA)>;
-o位表示可以省略结束标记
SGML文档可以用osx进行解析,输出可以用xmllint进行格式化,如下所示:
osx company.sgml | xmllint–格式-
上述命令的输出:
<;?xml version=“1.0”?>;
<;根>;
<;公司>;威盛公司</公司>;
<;表格>;24-7日</表格>;
<;地址>;
<;街道>;101欧防风LN</街道>;
<;拉链>;31337</拉链>;
</地址>;
</根>;
现在我们有了格式良好的XML,可以使用lxml或其他XML工具进行处理
我不知道您链接到的文档是否有完整的DTD。以下PDF文件包含有关EDGAR的相关信息,包括可能有用的DTD:http://www.sec.gov/info/edgar/pdsdissemspec910.pdf (我是通过这个答案找到的)。但是链接的SGML文档包含PDF文件中未提及的元素(SEC-HEADER)