Анализирайте xbrl файл в python

Работя върху xml анализатор. Целта е да се анализират редица различни xml файлове, където префиксите и таговете остават последователни, но пространствата от имена се променят.

Затова опитвам или:

  • за анализиране на xml само с <prefix:tags> без разрешаване (замяна) на префикса с пространството от имена. Префиксите остават непроменени от документ на документ.
  • за автоматично зареждане на пространствата от имена, така че идентификаторът (<prefix:tag>) да може да бъде заменен с правилното пространство от имена.
  • просто анализирайте xml по етикет

Опитах с xml.etree.ElementTree.

Разгледах и lxml Не намерих никаква опция за конфигуриране на XMLParser в lxml, който може да ми помогне, въпреки че тук мога да прочета отговор, където авторът предполага, че lxml трябва да може да събира пространства от имена за мен автоматично.

Интересното е, че parsed_file = etree.XML(file) се проваля с грешката:

lxml.etree.XMLSyntaxError: Start tag expected, '<' not found, line 1, column 1

Един пример за файловете, които бих искал да анализирам е тук


person NoIdeaHowToFixThis    schedule 15.05.2014    source източник
comment
items = tree.xpath("*[local-name(.) = 'a_tag_goes_here']") изглежда върши работата   -  person NoIdeaHowToFixThis    schedule 15.05.2014


Отговори (2)


Не се интересувайте от префиксите ns, интересувайте се от пълните пространства от имена

Понякога хората се интересуват от тези кратки префикси и забравят, че те са от второстепенно значение. Те са само кратка препратка към напълно квалифицирано пространство от имена. напр.

xmlns:trw="http://www.trw.com/20131231"

в xml означава отсега нататък "trw:" означава напълно квалифицирано пространство от имена "http://www.trw.com/20131231". Обърнете внимание, че този префикс може да бъде предефиниран във всяко друго пространство от имена във всеки следващ елемент и може да получи напълно различно значение.

От друга страна, когато ви интересува истинското значение, какво означава тук напълно квалифицирано пространство от имена, може да мислите за "trw:row" като "{http://www.trw.com/20131231}row". Това преведено значение ще бъде надеждно и няма да се промени с промени в префикса.

Разбор на препратен xml

Връзката към http://edgar.sec.gov/Archives/edgar/data/1267097/000104746914000925/trw-20131231.xml води до xml, който валидира от xmlstarlet и който lxml може да анализира.

Съобщението за грешка, което показвате, се отнася до първия знак от потока, така че има вероятност или да сте срещнали BOM байт във вашия файл, или се опитвате да прочетете xml, който е gzip и първо трябва да бъде декомпресиран.

lxml и пространства от имена

lxml работи добре с пространства от имена. Тя ви позволява да използвате XPath изрази, които използват пространства от имена. С контролирането на префикса на пространството за имена на изхода е малко по-сложно, тъй като зависи от атрибутите xmlns, които са част от сериализирания документ. Ако искате да промените префиксите, трябва по някакъв начин да организирате тези xmlns атрибути, често като преместите всички в основния елемент. В същото време lxml следи напълно квалифицираното пространство от имена на всеки елемент, така че в момента на сериализирането ще зачита това пълно име, както и текущо валидния префикс за това пространство от имена.

Работата с тези xmlna атрибути е малко повече код, вижте lxml документацията.

person Jan Vlcinsky    schedule 15.05.2014

items = tree.xpath("*[local-name(.) = 'a_tag_goes_here']")

свърши работата. Освен това трябваше да прегледам ръчно генерирания списък items, за да дефинирам другите си желани функции за филтриране.

person NoIdeaHowToFixThis    schedule 16.05.2014