Удаление недопустимых символов из потока XML - PullRequest
0 голосов
/ 18 октября 2018

Я анализирую XML-файл с SAX в Python.XML читается из потока HTTP через urllib.request.

Однако кажется, что поток XML содержит недопустимые символы.В частности, при декодировании из UTF-8 и выгрузке в файл, похоже, что передо мной стоит куча экземпляров '8000', за которыми следуют разрывы строк.Это приводит к сбою синтаксического анализа SAX.

Мой вопрос состоит из двух частей:

  1. Как я могу удалить или игнорировать недопустимые символы, если они появляются в потоке данных urllib.request?
  2. Что может быть 8000, и есть ли более конкретное решение для этой проблемы?

[править]

Я не могу поделиться исходными данными, но этопервые несколько символов в виде строки и шестнадцатеричного числа.Первые символы - это оскорбительный символ «8000».

Строка:

8000<?xml

Шестнадцатеричный:

38:30:30:30:3c:3f:78:6d:6c:20

Строка «8000» можно найти для замены,но это не очень хорошее решение, так как данные могут содержать эту довольно распространенную строку.

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Кажется, что код передает синтаксическому анализатору XML объект синтаксического анализатора файла из HTTPResponse (то есть HTTPResponse.fp), отправленного из urllib.request.urlopen, а не только из HTTPResponse.По какой-то причине это привело к записи порта (8000) в каждом буферизованном фрагменте BufferedReader.Похоже, что это была проблема, вызванная переходом с Python 2 на 3 (возможно, объект HTTPResponse вел себя по-разному в Python 2).

При подаче синтаксического анализатора XML HTTPResponse напрямую вместо response.fp порт былвыпал из потока байтов, и больше никаких проблем с кодированием не было.

0 голосов
/ 18 октября 2018

<?xml является началом декларации XML .

В XML может быть только одна декларация XMLдокумент, и он может появиться только как самое первое в файле.Для «8000», предшествующего ему, документ XML не правильно сформированный .Прежде чем пытаться проанализировать этот поток как XML, вы должны убедиться, что существует не более одной декларации XML и ничего не предшествует ей.Это должно быть сделано на уровне символа / строки / текста, а не на уровне XML.

См. Также Ошибка: сопоставление цели инструкции обработки "[xX] [мМ] [lL] "не разрешено

...