Кодировка символов нарушена - PullRequest
0 голосов
/ 23 сентября 2010

Я пытаюсь проанализировать файл, закодированный в utf-8. Ни у одной операции нет проблем, кроме записи в файл (или, по крайней мере, я так думаю). Ниже приведен минимальный рабочий пример:

from lxml import etree
parser = etree.HTMLParser()
tree = etree.parse('example.txt', parser)
tree.write('aaaaaaaaaaaaaaaaa.html')

example.txt:

<html>
    <body>
        <invalid html here/>
        <interesting attrib1="yes">
            <group>
                <line>
                    δεδομένα1
                </line>
            </group>
            <group>
                <line>
                    δεδομένα2
                </line>
            </group>
            <group>
                <line>
                    δεδομένα3
                </line>
            </group>
        </interesting>
    </body>
</html> 

Мне уже известен аналогичный предыдущий вопрос , но я не мог решить проблему ни без указания выходной кодировки, ни с использованием utf8 или iso-8859-7.

Я пришел к выводу, что файл находится в utf8, так как он правильно отображается в Chrome при выборе этой кодировки. Мой редактор (Кейт) соглашается.

Я не получаю ошибку времени выполнения, но вывод не такой, как хотелось бы. Пример вывода с tree.write('aaaaaaaaaaaaaaaaa.html', encoding='utf-8'):

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
        <invalid html="" here=""/><interesting attrib1="yes"><group><line>
                    δεδομένα1
                </line></group><group><line>
                    δεδομένα2
                </line></group><group><line>
                    δεδομένα3
                </line></group></interesting></body></html>

1 Ответ

1 голос
/ 24 сентября 2010

Очевидная проблема заключается в том, что HTMLParser по умолчанию обрабатывает входной файл как ANSI, то есть байты UTF-8 неверно интерпретируются как 8-битные коды символов.Вы можете просто передать кодировку, чтобы исправить это:

parser = etree.HTMLParser(encoding = "utf-8")

Если вы хотите проверить, что я имел в виду с неверной интерпретацией, пусть Python печатает repr(tree.xpath("//line")[0].text) с параметром encoding HTMLParser и без него.

...