gpt4 book ai didi

python - 在 Python 3 中使用 Open Arbitrary 标签解析 SGML

转载 作者:太空狗 更新时间:2023-10-29 17:20:46 25 4
gpt4 key购买 nike

我正在尝试解析一个文件,例如: 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>

这最终被解释为:

<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,一个解决方案可能是使用 osx SGML 到 XML 的转换器,来自 OpenSP SGML toolkit将文档转换为 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解析,输出可以用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>

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

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

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

25 4 0