xml.etree.ElementTree.ParseError: неправильно сформирован (неверный токен) - PullRequest
0 голосов
/ 26 июня 2018

Использование Python 3

Ошибка, которую мы получаем:

File "C:/scratch.py", line 27, in run
    tree = ET.fromstring(responses[0].decode(), ET.XMLParser(encoding='utf-8'))
  File "C:\Programs\Python\Python36-32\lib\xml\etree\ElementTree.py", line 1314, in XML
    parser.feed(text)
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 163, column 1106

Наш код:

tree = ET.fromstring(responses[0].decode(), ET.XMLParser(encoding='utf-8'))
    for i in tree.iter('item'):
        try:
            title = i.find('title').text
        except Exception:
            pass

Ответы [0] взяты из списка возвращаемых запросов на получение URL-адресов, но в этом случае индекса 0 тестируется по одному конкретному URL-адресу: http://feeds.feedburner.com/marginalrevolution/feed

Мы смогли подключить код XML к валидатору W3 School и получили:

This page contains the following errors:
error on line 163 at column 31: Input is not in proper UTF-8, indicate encoding! Bytes: 0x0C 0x66 0x69 0x67

Но со свойством ET.XMLParser(encoding='utf-8') разве это не исправит ошибку при разборе?

1 Ответ

0 голосов
/ 27 июня 2018

Сообщение об ошибке W3 Schools validator вводит в заблуждение. Проблема с 0x0c не в том, что это недопустимый UTF-8, а в том, что это не допустимый символ в XML.

0x0c - это форма feed управляющий символ, поэтому его присутствие в документе бесполезно. Соответствующие анализаторы XML обязаны отклонять документы, которые не были правильно сформированы, и вы не можете изменить канал rss, поэтому самое простое решение - удалить его из документа перед обработкой.

>>> tree = ET.fromstring(original_response, ET.XMLParser(encoding='utf-8'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.7/xml/etree/ElementTree.py", line 1315, in XML
    parser.feed(text)
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 185, column 1106

>>> fixed = original_response.replace(b'\x0c', b'')
>>> tree = ET.fromstring(fixed, ET.XMLParser(encoding='utf-8'))
>>> tree
<Element 'rss' at 0x7ff316db6278>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...