法语和lxml文本

dus*_*999 8 python lxml

我正在尝试使用lxml将有效的法语文本字符串分配给文本字符串:

el = etree.Element("someelement")
el.text = 'Disponible à partir du 1er Octobre'
Run Code Online (Sandbox Code Playgroud)

我收到错误:

ValueError:所有字符串必须兼容XML:Unicode或ASCII,无NULL字节或控制字符

我也尝试过:

el.ext = etree.CDATA('Disponible à partir du 1er Octobre')
Run Code Online (Sandbox Code Playgroud)

但是我得到了同样的错误.

如何处理XML中的法语,特别是ISO-8859-1?有一些方法可以在lxml中的tostring()函数中指定编码,但不能在元素中指定文本值.

Abb*_*der 5

如果您有python <3的版本,您可以尝试: el.text = u'Disponible à partir du 1er Octobre'


jfs*_*jfs 5

如果文本包含非ASCII数据,则应将其作为Unicode字符串提供el.text

正如@Abbasov Alexander的答案所示,您可以使用Unicode字面量做到这一点u''。Python没有引发异常,因此我假设您已经声明了Python源文件的字符编码(例如,# coding: utf-8在顶部使用注释)。此编码定义了Python如何解释源中的非ASCII字符,它与用于将xml保存到文件中的编码无关。

如果文本已经存在于变量中,而您尚未将其转换为Unicode,则可以使用text.decode(text_encoding)text_encoding可能与Python源编码无关)进行处理。

令人困惑的是,el.text(作为一种优化)在Python 2上针对纯ascii数据返回了一个字节串。它违反了不得混用字节和Unicode字符串的规则。虽然它应该能够sys.getdefaultencoding()像大多数情况一样返回基于ascii的编码。

要保存xml,请将所需的任何字符编码传递给tostring()ElementTree.write()函数。同样,此编码与其他已经提到的编码无关。

通常,使用Unicode三明治:在收到字节后立即将其解码为Unicode,在程序内部使用Unicode文本,当需要使用不支持Unicode的API发送文本时,尽可能晚地将其编码为字节(文件,网络)。