Найти - Пользователи
Полная версия: парсинг xml файла, что делаю не так?
Начало » Python для новичков » парсинг xml файла, что делаю не так?
1
Iris
всем привет, подскажите, пожалуйста. мне нужно пропарсить xml документ, я открываю докс пайтон орг, смотрю страничку xml.etree.ElementTree и вроде всё просто, есть кусок кода, бери да делай

import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()

я ввожу первую строку, вторую и интерпретатор выдает мне ошибку

Traceback (most recent call last):
File “D:\Users\�����\Miniconda3\lib\site-packages\IPython\core\interactiveshell.py”, line 3066, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File “<ipython-input-3-08e39a478024>”, line 1, in <module>
tree = ET.parse('BarterList.xml')
File “D:\Users\�����\Miniconda3\lib\xml\etree\ElementTree.py”, line 1187, in parse
tree.parse(source, parser)
File “D:\Users\�����\Miniconda3\lib\xml\etree\ElementTree.py”, line 598, in parse
self._root = parser._parse_whole(source)
File “<string>”, line None
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1747, column 45

тут у меня ступор
PooH
Iris
ParseError: not well-formed (invalid token)
Документ имеет неправильную структуру, невалидный xml. Документ country_data.xml покажте
Iris
вот этот пытаюсь прочитать.
читаю я его конечно строкой tree = ET.parse('BarterList.xml')
py.user.next
Надо всё поместить в главный (корневой) узел. По спецификации XML в документе может быть только один узел, а в нём все остальные.
Iris
py.user.next
Надо всё поместить в главный (корневой) узел. По спецификации XML в документе может быть только один узел, а в нём все остальные.
Спасибо!
а есть смысл решать задачу через pyparsing? или с ним тоже всё придется к одному узлу приводить?
py.user.next
Iris
а есть смысл решать задачу через pyparsing?
Нет.
pyparsing используется для построения грамматик и последующего разбора по ним. А здесь анализатор грамматики языка xml уже реализован в модулях xml, lxml.

Iris
или с ним тоже всё придется к одному узлу приводить?
С ним придётся писать с нуля всё то, что уже находится внутри модулей для разбора xml.

Можешь использовать lxml, он легче работает с кусками xml, но для этого модуль надо будет устанавливать, а на винде он не очень хорошо ставится; вплоть до компиляции может дело доходить.
PooH
Отсутсвие корневого тега то не проблема, делаем временный файл, пишем туда открывающий фейковый корневой тег, пишем исходый файл, пишем закрывающий корневой тег, парсим временный файл, удаляем временный файл. Но у вас все еще хуже. XML не допускает вложенные комментарии, а этом файле их куча.
➜  ~ xmlstarlet val -e BarterList.xml
BarterList.xml:1747.44: Comment not terminated
<!-- <LostItemType>107</LostItemType><!
<!-- <LostItemType>107</LostItemType><!-- Костюм пачка --> -->
^
BarterList.xml - invalid
Можно разве что попробывать регуляркой повырезать их перед парсингом. Вопрос, похоже риторический, зачем использовать формат, если не знаешь его?! (Это даже не ваш огород камешек, просто в сети полно статей - очень очень быстрый и почти как настоящий парсер xml).
Iris
Спасибо большое)) начала просто работать с другим файлом, там всё ок)
aliacacia
I appreciate the inclusion of diverse perspectives, as it enriches the article and demonstrates Pokerogue a commitment to presenting a well-rounded view of the topic.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB