在Python 3中使用打开的任意标记解析SGML

我正在尝试分析一个文件,例如:
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
&lt/地址>

这最终被解释为:

<公司>真棒公司
<表格>24-7
<地址>
<街道>101欧防风
<拉链>31337
&lt/地址>
&lt/拉链>
&lt/街道>
&lt/表格>
&lt/公司>

但是,我需要将其解释为:

<公司>威盛公司&lt/公司>
<表格>24-7日&lt/表格>
<地址>
<街道>101欧防风LN&lt/街道>
<拉链>31337&lt/拉链>
&lt/地址>

如果要传递给LXML/BS4的非默认解析器可以处理这个问题,那么我就缺少它

如果您可以为您使用的文档找到SGML DTD,那么解决方案可能是使用OpenSP SGML工具包中的osxSGML-to-XML转换器将文档转换为XML

下面是一个简单的例子。假设我们有以下SGML文档(company.SGML;带有根元素):

<!DOCTYPE根系统“company.dtd”>
<根>
<公司>真棒公司
<表格>24-7
<地址>
<街道>101欧防风
<拉链>31337
&lt/地址>

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”?>
<根>
<公司>威盛公司&lt/公司>
<表格>24-7日&lt/表格>
<地址>
<街道>101欧防风LN&lt/街道>
<拉链>31337&lt/拉链>
&lt/地址>
&lt/根>

现在我们有了格式良好的XML,可以使用lxml或其他XML工具进行处理

我不知道您链接到的文档是否有完整的DTD。以下PDF文件包含有关EDGAR的相关信息,包括可能有用的DTD:http://www.sec.gov/info/edgar/pdsdissemspec910.pdf (我是通过这个答案找到的)。但是链接的SGML文档包含PDF文件中未提及的元素(SEC-HEADER

发表评论