Сбой синтаксического анализа XML-файлов стека обмена - PullRequest
1 голос
/ 15 марта 2019

Я пытаюсь проанализировать файл PostHistory.xml из обмена обмена стека *1002*.Мой код выглядит так:

import xml.etree.ElementTree as eTree
with open("PostHistory.xml", 'r') as xml_file:
    xml_tree = eTree.parse(xml_file)

Но я получаю:

UnicodeDecodeError: 'utf-8' codec can't decode 
bytes in position 1959-1960: invalid continuation byte

Я могу прочитать текст файла так:

with open("PostHistory.xml") as xml_file:
     a = xml_file.readline()

Файл* команда возвращает это описание для файла:

PostHistory.xml: XML 1.0 document, UTF-8 Unicode (with BOM) text, 
with very long lines, with CRLF line terminators

Также первая строка файла подтверждает кодировку UTF-8:

<?xml version="1.0" encoding="utf-8"?>

Я пытался добавить параметр encoding="utf-8-sig"но я снова получил ту же ошибку.

Размер файла 112 Гб.Я что-то здесь упускаю?

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Вы можете попробовать что-то вроде этого:

    with open(posts_path) as xml_file:  
        for line in xml_file:            
            try:                    
                xml_obj = eTree.fromstring(line)                    
            except UnicodeDecodeError as e:
                # Dealing with corrupted encoded strings
                new_str = line.encode("latin-1", "ignore")
                xml_obj1 = eTree.fromstring(ww)

Так что, когда вы получите недопустимые символы, вы закодируете их как "latin-1"

0 голосов
/ 15 марта 2019

Реальность байтов файла может противоречить кодировке, указанной в объявлении XML.(Простая установка кодировки в объявлении XML не изменит остальные байты в файле.)

Вы можете попробовать

open("PostHistory.xml", 'r', encoding="ISO-8859-1")

, но вам, возможно, придется закатать рукаваи исправьте ошибочный байт на 1959-1960, если речь идет о повреждении данных, а не о проблеме кодирования всего файла.

См. также:

...