Кодировка символов нарушена

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

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

пример.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>

person Dimitris Leventeas    schedule 23.09.2010    source источник
comment
Какую ошибку вы получаете, и как вы ее получаете? Пожалуйста, опубликуйте код, который ломается, и ошибку, которую он дает. Вопрос, который вы связали, говорит вам, что lxml записывает все в ASCII, если вы не скажете ему не делать этого; ты пробовал tree.write(<file>,encoding="utf-8")?   -  person Katriel    schedule 23.09.2010
comment
Я отредактировал вопрос. Я не получаю ошибки времени выполнения. К сожалению, вывод не закодирован должным образом, как вы можете видеть.   -  person Dimitris Leventeas    schedule 23.09.2010
comment
Я не знаю эту библиотеку, но, возможно, вам также нужно указать входную кодировку (по умолчанию она может быть ASCII или вашей локальной кодировкой по умолчанию). Почему, кстати, вы используете недопустимый HTML-документ для этого примера?   -  person Fred Foo    schedule 23.09.2010
comment
Спасибо! Это была входная кодировка. Похоже, что lxml использует кодировку, указанную в первой строке файла (если отсутствует, то использует ascii). Указать в программе я не мог, но когда дописал строку в начале файла с нужной кодировкой, все заработало. Кстати, я использовал недопустимый html, чтобы обозначить, что я должен использовать lxml, а не другую библиотеку.   -  person Dimitris Leventeas    schedule 23.09.2010


Ответы (1)


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

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

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

person AndiDog    schedule 23.09.2010