Форум сайта python.su
Здравствуйте. Есть xml файл, который правильно отображается только через edge/explorer. Выглядит так:
<?xml version="1.0" encoding="ISO-8859-1"?>
<Файл КолДок="294" ТипИнф="ОТКРДАННЫЕ1" ВерсПрог="1.0" ВерсФорм="4.01" ИдФайл="VO_OTKRDAN1_9965_9965_20180731_000a528a-e339-4def-92ad-b5a9dbd18e31">
...
# -*- coding: latin-1 -*-
# -*- coding: ISO-8859-1 -*-
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 49: character maps to <undefined>
decode('iso-8859-1').encode('utf8')
<?xml version="1.0" encoding="UTF-8"?><Файл ИдФайл="VO_OTKRDAN1_9965_9965_20180731_000a528a-e339-4def-92ad-b5a9dbd18e31" ВерсФорм="4.01" ВерсПрог="1.0" ТипИнф="ОТКРДАННЫЕ1" КолДок="294"><ИдОтпр><ФИООтв Фамилия="_" Имя="_"/></ИдОтпр><Документ ИдДок="06e5e343-a969-818f-cab7-6d0efdb54494" ДатаДок="31.07.2018" ДатаСост="01.01.2018"><СведНП НаимОрг="ОБЩЕСТВО С ОГРАНИЧЕННОЙ
...
Офлайн
Если попробовать открывать через модули, вроде xml.etree или xmltodict с указанием encoding='ISO-8859-1', то всегда получаю:
xml.parsers.expat.ExpatError: not well-formed (invalid token): line 1, column 40
Офлайн
PulivechДа ты не понимаешь, где какая кодировка. Есть кодировка документа XML, есть кодировка файла XML, есть кодировка исходника на питоне, есть кодировка вывода консоли. И это всё разные кодировки.
Пробую использовать
>>> import xml.etree.ElementTree as ET >>> >>> s = '<Файл КолДок="294" ТипИнф="ОТКРДАННЫЕ1" ВерсПрог="1.0" ВерсФорм="4.01" ИдФайл="VO_OTKRDAN1_9965_9965_20180731_000a528a-e339-4def-92ad-b5a9dbd18e31" />' >>> >>> doc = ET.fromstring(s) >>> doc <Element 'Файл' at 0x7fc3e6ffac28> >>> doc.attrib {'КолДок': '294', 'ТипИнф': 'ОТКРДАННЫЕ1', 'ВерсПрог': '1.0', 'ВерсФорм': '4.01', 'ИдФайл': 'VO_OTKRDAN1_9965_9965_20180731_000a528a-e339-4def-92ad-b5a9dbd18e31'} >>>
Отредактировано py.user.next (Авг. 4, 2018 13:17:01)
Офлайн
from lxml import etree
def xmlparser(xmlfile):
with open(xmlfile, encoding='ISO-8859-1') as f:
xml = f.read()
root = etree.fromstring(xml)
for appt in root.getchildren():
for elem in appt.getchildren():
if not elem.text:
text = "None"
else:
text = elem.text
print(elem.tag + " - " + text)
if __name__ == "__main__":
xmlparser(r'T:\downloads\opendata\1.xml')
ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.
Офлайн
py.user.nextВозможно. В чем разница между ними? Если я открываю xml файл с определенной кодировкой и при этом указываю encoding='ISO-8859-1', это не значит, что я все правильно сделал?
Да ты не понимаешь, где какая кодировка. Есть кодировка документа XML, есть кодировка файла XML, есть кодировка исходника на питоне. И это всё разные кодировки.
Прикреплённый файлы: 1.xml (194,0 KБ)
Офлайн
Там кодировка у документа utf-8 указана.
t.py
#!/usr/bin/env python3 import xml.etree.ElementTree as ET with open('1.xml', encoding='utf-8') as fin: data = fin.read() doc = ET.fromstring(data) print(doc, doc.attrib)
[guest@localhost py]$ ./t.py
<Element 'Файл' at 0x7f8e84d60048> {'ИдФайл': 'VO_OTKRDAN1_9965_9965_20180731_000a528a-e339-4def-92ad-b5a9dbd18e31', 'ВерсФорм': '4.01', 'ВерсПрог': '1.0', 'ТипИнф': 'ОТКРДАННЫЕ1', 'КолДок': '294'}
[guest@localhost py]$
Отредактировано py.user.next (Авг. 4, 2018 13:12:12)
Офлайн
py.user.next
вы попробуйте получить информацию из 2 тега или как он называется в разметке по всем строкам после 2-ой. У вас будет кракозябра, потому что кодировка ISO-8859-1, а не utf-8. Я имею ввиду сам текст внутри тегов, которые получается через .text.
Отредактировано Pulivech (Авг. 4, 2018 13:21:53)
Офлайн
Тот файл, который ты передал, не содержит текста в тегах.
Только в атрибутах (в именах и значениях) есть кириллица и всё читается прекрасно.
#!/usr/bin/env python3 import xml.etree.ElementTree as ET with open('1.xml', encoding='utf-8') as fin: data = fin.read() doc = ET.fromstring(data) for i in doc.iter(): print(i.text, i.tail)
[guest@localhost py]$ ./t.py
None None
None None
None None
...
Отредактировано py.user.next (Авг. 5, 2018 03:03:10)
Офлайн