Очистка XML-файла в Python перед анализом - PullRequest
1 голос
/ 30 марта 2010

Я использую minidom для разбора XML-файла, и он выдал ошибку, указывающую на то, что данные плохо сформированы. Я выяснил, что на некоторых страницах есть символы типа ไอเฟล &, что приводит к сбоям в работе анализатора. Есть ли простой способ очистить файл перед его разбором? Прямо сейчас я использую регулярное выражение, чтобы выбросить все, что не является буквенно-цифровым символом и символами </>, но это не совсем работает.

Ответы [ 5 ]

3 голосов
/ 30 марта 2010

Попробуйте

xmltext = re.sub(u"[^\x20-\x7f]+",u"",xmltext)

Он избавится от всего, кроме диапазона 0x20-0x7F.

Вы можете начать с \ x01, если хотите сохранить управляющие символы, такие как табуляция, разрывы строк.

xmltext = re.sub(u"[^\x01-\x7f]+",u"",xmltext)
1 голос
/ 30 марта 2010

Взгляните на µTidyLib , оболочку Python для TidyLib .

0 голосов
/ 30 марта 2010

Похоже, вы имеете дело с данными, которые сохраняются с какой-то кодировкой, «как если бы они были ASCII». XML-файл обычно должен быть UTF8, и SAX (основной синтаксический анализатор, используемый minidom) должен обрабатывать это, поэтому похоже, что что-то не так в этой части цепочки обработки. Вместо того, чтобы сосредоточиться на «очистке», я сначала попробую убедиться, что кодировка правильная и правильно распознана. Может быть, сломанная директива XML? Можете ли вы отредактировать свой Q, чтобы показать первые несколько строк файла, особенно директиву <?xml ... в самом начале?

0 голосов
/ 30 марта 2010

Если вам нужны данные со странными символами, которые вы могли бы, вместо того, чтобы просто удалить их, преобразуйте их в коды, понятные синтаксическому анализатору XML.

Вы можете взглянуть на уникальные данные .Пакет , особенно метод нормализации.

Я сам этим не пользовался, поэтому не могу вам все рассказать, но вы можете еще раз спросить здесь на SO, если решите, что собираетесьпреобразовать и сохранить эти данные.

>>> import unicodedata
>>> unicodedata.normalize("NFKD" , u"ไภเฟล &")
u'a\u03001\u201ea\u0300 \u0327 a\u03001\u20aca\u0300 \u0327Y\u0308a\u0300 \u0327\xa5 &'
0 голосов
/ 30 марта 2010

Я бы выбрасывал все не-ASCII символы, которые можно идентифицировать, если установить 8-й бит (0x80) (128 .. 255 соответственно 0x80 ... 0xff).

  • Вы можете прочитать в файле строку Python с именем old_str

  • Затем выполнить вызов filter в сочетании с оператором lambda:

    new_str = filter(lambda x: x in string.ascii_letters, old_str)
    
  • Parse new_str

Существует множество способов выполнения извлечения не-ASCII-символов из строки.

Этот вопрос может быть связан: Как проверить, находится ли строка в Python в ASCII?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...