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

One Solution collect form web for “Разбор SGML с открытыми произвольными метками в Python 3”

Если вы можете найти DTML SGML для документов, с которыми работаете, решение может заключаться в использовании конвертера SGML для XML osx из инструментария OpenSP SGML для преобразования документов в 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/pdsdissemspec1010.pdf (я нашел это через этот ответ ). Но связанный документ SGML содержит элементы (например, SEC-HEADER ), которые не упоминаются в файле PDF.

  • Установите DTD с помощью мини-диска в python
  • Добавить в исходный xml-файл из цикла for в python
  • Каков самый простой способ, который не имеет памяти для вывода XML из Python?
  • Как преобразовать XML-файл с помощью XSLT в Python?
  • Рекомендуемый способ генерации документов XHTML с помощью lxml
  • ElementTree findall () возвращает пустой список
  • Как включить пространства имен в xml-файл с помощью lxml?
  • проблема с новыми строками, когда я использую toprettyxml ()
  • Python - лучший язык программирования в мире.