Я должен загрузить и проанализировать веб-страницу с 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')
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?