Necesito descargar y analizar la página web con lxml y generar la salida UTF-8 xml. Creo esquema en pseudocódigo es más ilustrativa:Codificación en python con lxml: solución compleja
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))
Así WebFile puede estar en cualquier codificación (lxml debe manejar esto). El archivo de salida debe estar en utf-8. No estoy seguro de dónde usar la codificación/codificación. ¿Este esquema está bien? (No puedo encontrar un buen tutorial sobre lxml y codificación, pero puedo encontrar muchos problemas con esto ...) Necesito una solución sólida.
Editar:
lo tanto, para el envío de UTF-8 a LXML utilizo
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')
Unicode Dammit parece bueno. Y sobre etree tienes razón, lo he quitado del código. –
¿Por qué no pasar directamente la cadena decodificada (objeto Unicode) a html.fromstring(), en lugar de volver a codificarlo en utf-8? – lajarre
No puedo recordar cuál fue específicamente la motivación hace dos años y medio, pero recuerdo vagamente que a lxml no le gustó la entrada de Unicode en algunos casos. Hay muchas posibilidades de que, sea cual sea el problema, se arregle, por lo que es mejor ignorar esa parte ahora. Sin embargo, a libxml2 (que funciona con lxml) le gusta la entrada UTF-8, por lo que si usted es muy sensible al rendimiento, es posible que desee evitar decodificar esa codificación en particular. –