使用Python 3解析带有任意标记的SGML

19

我正在尝试解析类似以下文件的内容: http://www.sec.gov/Archives/edgar/data/1409896/000118143112051484/0001181431-12-051484.hdr.sgml

我使用Python 3,并且一直无法找到使用现有库解析带有开放标记SGML文件的解决方案。SGML允许隐式关闭标记。当尝试使用LXML、XML或beautiful soup解析示例文件时,最终会将隐式关闭标记关闭在文件末尾而不是行末。

例如:

<COMPANY>Awesome Corp
<FORM> 24-7
<ADDRESS>
<STREET>101 PARSNIP LN
<ZIP>31337
</ADDRESS>

这最终被解释为:

<COMPANY>Awesome Corp
<FORM> 24-7
<ADDRESS>
<STREET>101 PARSNIP LN
<ZIP>31337
</ADDRESS>
</ZIP>
</STREET>
</FORM>
</COMPANY>

然而,我需要它被解释为:

<COMPANY>Awesome Corp</COMPANY>  
<FORM> 24-7</FORM>
<ADDRESS>
<STREET>101 PARSNIP LN</STREET>
<ZIP>31337</ZIP>
</ADDRESS>

如果有一个可以处理这个问题的非默认解析器可以传递给LXML/BS4,而我却没有发现它。


可能是重复问题 - https://dev59.com/imMm5IYBdhLWcg3wHMJ0 - ChrisF
@borncamp 你解决了吗? - eggie5
我已将上述文本解析为XML和JSON格式。如果您需要任何帮助,请在此处或Upwork上告诉我。 - Shyam sundar shah
1个回答

7
如果您能找到适用于您所使用的文档的SGML DTD,一种解决方案是使用OpenSP SGML toolkit中的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>

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) >
< p > - o 位表示结束标记可以省略。

SGML文档可以使用 osx 解析,输出可以使用 xmllint 格式化,如下所示:

osx company.sgml | xmllint --format -

上述命令的输出:
<?xml version="1.0"?>
<ROOT>
  <COMPANY>Awesome Corp</COMPANY>
  <FORM> 24-7</FORM>
  <ADDRESS>
    <STREET>101 PARSNIP LN</STREET>
    <ZIP>31337</ZIP>
  </ADDRESS>
</ROOT>

现在我们有格式良好的XML,可以使用lxml或其他XML工具进行处理。
我不知道您链接的文档是否有完整的DTD。以下PDF文件包含有关EDGAR的相关信息,包括可能有用的DTD:http://www.sec.gov/info/edgar/pdsdissemspec910.pdf(我通过this answer找到了它)。但是,链接的SGML文档包含一些在PDF文件中没有提到的元素(例如SEC-HEADER)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接