Найти - Пользователи
Полная версия: xml.etree.ElementTree.ParseError и emoji :)
Начало » Python для новичков » xml.etree.ElementTree.ParseError и emoji :)
1
BambangEladio
Не могу распарсить 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

Whoami
 >>> 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')


JOHN_16
BambangEladio
угу, а сам файл приложить видимо не догадались) Ну, я сделал свой файлик, и смог прочитать, распарсить вот этим вот кодом. Вы уверены что правильно файл создали?
BambangEladio
Додумался.

Нет слов
JOHN_16
попробуйте кодировку все таки указать для XML, вы же в винде сидите, у нее по умолчанию не UTF-8, в отличии от unix подобных
<?xml version=“1.0” encoding=“utf-8” ?>
P.S. и да это не проблема именно Питона, если вы так подумали.
BambangEladio
Просто мне нужно было прочесть спецификацию 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]

По неведомой причине в документе каждый смайлик начинается с #x1

В итоге решил проблему вот так:
 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)
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