Кодирование в Python с lxml - сложное решение

Я должен загрузить и проанализировать веб-страницу с lxml и создать UTF-8 xml вывод. Я думаю, что схема в псевдокоде более иллюстративна:

from lxml import etree

webfile = urllib2.urlopen(url)
root = etree.parse(webfile.read(), parser=etree.HTMLParser(recover=True))

txt = my_process_text(etree.tostring(root.xpath('/html/body'), encoding=utf8))


output = etree.Element("out")
output.text = txt

outputfile.write(etree.tostring(output, encoding=utf8))

Таким образом, webfile может быть в любом кодировании (lxml, должен обработать это). Outputfile должны быть в utf-8. Я не уверен, где использовать кодирование/кодирование. Эта схема хорошо? (Я наклоняюсь, находят хорошее учебное руководство о lxml и кодировании, но я могу найти много проблем с этим...), мне нужно надежное решение.

Править:

Таким образом для отправки utf-8 к lxml я использую

        converted = UnicodeDammit(webfile, isHTML=True)
        if not converted.unicode:
            print "ERR. UnicodeDammit failed to detect encoding, tried [%s]", \
                ', '.join(converted.triedEncodings)
            continue
        webfile = converted.unicode.encode('utf-8')
10
задан Vojta Rylko 16 November 2016 в 10:20
поделиться

1 ответ

lxml может немного не подходить к кодировкам ввода. Лучше всего отправить UTF8 и получить UTF8.

Вы можете использовать модуль chardet или UnicodeDammit для декодирования фактических данных.

Вы могли бы сделать что-то вроде:

import chardet
from lxml import html
content = urllib2.urlopen(url).read()
encoding = chardet.detect(content)['encoding']
if encoding != 'utf-8':
    content = content.decode(encoding, 'replace').encode('utf-8')
doc = html.fromstring(content, base_url=url)

Я не уверен, почему вы переходите между lxml и etree, если только вы не взаимодействуете с другой библиотекой, которая уже использует etree?

18
ответ дан 3 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: