Форум сайта python.su
0
Не могу распарсить xml'ку
XML
<?xml version="1.0" ?> <root> <item> <fail>🙏</fail> </item> </root>
from xml.etree import ElementTree data = ElementTree.parse('in.xml').getroot() # xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 4, column 6
>>> platform.uname() uname_result(system='Windows', node='DESKTOP', release='10', version='10.0.14393', machine='AMD64', processor='AMD64 Family 21 Model 2 Stepping 0, AuthenticAMD') >>> platform.python_implementation() 'CPython' >>> platform.python_build() ('v3.6.1:69c0db5', 'Mar 21 2017 18:41:36')
Отредактировано BambangEladio (Сен. 27, 2017 16:13:52)
Офлайн
221
BambangEladio
угу, а сам файл приложить видимо не догадались) Ну, я сделал свой файлик, и смог прочитать, распарсить вот этим вот кодом. Вы уверены что правильно файл создали?
Прикреплённый файлы:
test.xml (70 байт)
Офлайн
0
Додумался.
Нет слов ![]()
![]()
![]()
Отредактировано BambangEladio (Сен. 27, 2017 22:30:03)
Офлайн
221
попробуйте кодировку все таки указать для XML, вы же в винде сидите, у нее по умолчанию не UTF-8, в отличии от unix подобных
<?xml version=“1.0” encoding=“utf-8” ?>P.S. и да это не проблема именно Питона, если вы так подумали.
Отредактировано JOHN_16 (Сен. 28, 2017 14:23:44)
Офлайн
0
Просто мне нужно было прочесть спецификацию xml 
Чего я не сделал ![]()
Char ::= [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */ RestrictedChar ::= [#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]
def sanitize_xml(filename_in: AnyStr, need_delete_source_file: bool = True) -> None: assert os.path.exists(filename_in) need_delete = [r'[\u0000–\u0008]'] while True: n = gen_random_str() p = '{p}{s}{f}.xml'.format(p=TMP_DIR, s=os.sep, f=n) if not os.path.exists(p): tmp_file = p break with open(tmp_file, 'w', encoding='utf-16-le') as f_out: with open(filename_in, 'r', encoding='utf-16-le') as f_in: last_pos = 0 f_in.seek(last_pos) line = f_in.readline() last_pos = f_in.tell() while line: new_line = line for pattern in need_delete: new_line = re.sub(pattern, r'', new_line) f_out.write(new_line) f_in.seek(last_pos) line = f_in.readline() last_pos = f_in.tell() base_path, name = os.path.split(filename_in) assert base_path == os.path.split(tmp_file)[0], 'WTF?' print(base_path) if need_delete_source_file: os.remove(filename_in) else: os.rename( filename_in, '{p}{s}{new}-{rnd}.{old}'.format( p=base_path, s=os.sep, old=name, new='src', rnd=gen_random_str(), ) ) os.rename(tmp_file, filename_in)
Отредактировано BambangEladio (Сен. 29, 2017 13:59:46)
Офлайн