Подтвердить что ты не робот

Разбор SGML с открытыми произвольными метками в Python 3

Я пытаюсь проанализировать файл, например: 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, который может справиться с этим, я не могу его пропустить.

4b9b3361

Ответ 1

Если вы можете найти SGML DTD для документов, с которыми работаете, решение может заключаться в использовании конвертера SGML для XML osx из 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>

Теперь у нас есть хорошо сформированный XML, который можно обрабатывать с помощью lxml или других инструментов XML.

Я не знаю, есть ли полное DTD для документа, на который вы ссылаетесь. Следующий файл PDF содержит связанную информацию об EDGAR, в том числе DTD, которая может быть полезна: http://www.sec.gov/info/edgar/pdsdissemspec910.pdf (я нашел его через этот ответ). Но связанный документ SGML содержит элементы (SEC-HEADER, например), которые не упоминаются в файле PDF.