Texto en francés y lxml

Estoy tratando de asignar una cadena de texto francesa válida a una cadena de texto usando lxml:

el = etree.Element("someelement") el.text = 'Disponible à partir du 1er Octobre' 

Me sale el error:

ValueError: todas las cadenas deben ser compatibles con XML: Unicode o ASCII, sin bytes NULOS ni caracteres de control

También he intentado:

 el.ext = etree.CDATA('Disponible à partir du 1er Octobre') 

Sin embargo me sale el mismo error.

¿Cómo manejo el francés en XML, en particular, ISO-8859-1? Hay formas de especificar la encoding dentro de la función tostring () en lxml, pero no para asignar valores de texto dentro de los elementos.

Si el texto contiene datos que no son el.text debe proporcionarlos como una cadena Unicode para el.text .

Como la respuesta de @Abbasov Alexander muestra que puedes hacerlo utilizando un literal Unicode u'' . Python no ha generado una excepción, por lo que asumo que ha declarado una encoding de caracteres de su archivo fuente de Python (por ejemplo, utilizando # coding: utf-8 comentario en la parte superior). Esta encoding define cómo Python interpreta los caracteres no-ascii en la fuente, no está relacionada con la encoding que utiliza para guardar xml en un archivo.

Si el texto ya está en una variable y aún no lo ha convertido a Unicode, puede hacerlo usando text.decode(text_encoding) ( text_encoding puede no estar relacionado con la encoding de fuente de Python).

El bit confuso podría ser que el.text (como una optimización) devuelve un bytestring en Python 2 para datos ascii puros. Rompe la regla de que no debe mezclar bytes y cadenas Unicode. Aunque debería funcionar si sys.getdefaultencoding() devuelve una encoding basada en ascii como lo hace en la mayoría de los casos.

Para guardar xml, pase cualquier encoding de caracteres que necesite a las tostring() o ElementTree.write() . De nuevo, esta encoding no está relacionada con otras codificaciones ya mencionadas.

En general, use Unicode sandwich : decodifique bytes a Unicode tan pronto como los reciba, trabaje con texto Unicode dentro de su progtwig, codifique a bytes lo más tarde posible cuando necesite enviar el texto usando una API que no sea compatible con Unicode (archivos , red).

Si tienes una versión de python <3, puedes probar: el.text = u’Disponible à partir du 1er Octobre’