我正在尝试分析一个文件,例如:
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来处理这个问题,我就缺少它了。

最佳答案

如果您可以为您使用的文档找到一个SGML DTD,那么解决方案可能是使用OpenSP SGML toolkit中的osx sgml-to-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) >

- o位表示可以省略结束标记。
SGML文档可以用OSX解析,输出可以用xmlint格式化,如下所示:
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)。

关于python - 在Python 3中使用开放任意标记解析SGML,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12505419/

10-09 15:50