Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 27, 2017 16:13:12

BambangEladio
Зарегистрирован: 2017-06-11
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

xml.etree.ElementTree.ParseError и emoji :)

Не могу распарсить 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')


Отредактировано BambangEladio (Сен. 27, 2017 16:13:52)

Офлайн

#2 Сен. 27, 2017 20:22:35

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

xml.etree.ElementTree.ParseError и emoji :)

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



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Прикреплённый файлы:
attachment test.xml (70 байт)

Офлайн

#3 Сен. 27, 2017 22:06:19

BambangEladio
Зарегистрирован: 2017-06-11
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

xml.etree.ElementTree.ParseError и emoji :)

Додумался.

Нет слов

Отредактировано BambangEladio (Сен. 27, 2017 22:30:03)

Офлайн

#4 Сен. 28, 2017 14:21:51

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

xml.etree.ElementTree.ParseError и emoji :)

попробуйте кодировку все таки указать для XML, вы же в винде сидите, у нее по умолчанию не UTF-8, в отличии от unix подобных

<?xml version=“1.0” encoding=“utf-8” ?>
P.S. и да это не проблема именно Питона, если вы так подумали.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Отредактировано JOHN_16 (Сен. 28, 2017 14:23:44)

Офлайн

#5 Сен. 29, 2017 13:54:14

BambangEladio
Зарегистрирован: 2017-06-11
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

xml.etree.ElementTree.ParseError и emoji :)

Просто мне нужно было прочесть спецификацию 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)

Отредактировано BambangEladio (Сен. 29, 2017 13:59:46)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version