法语和lxml文本

时间:2013-06-16 21:53:07

标签: python lxml

我正在尝试使用lxml:

将有效的法语文本字符串分配给文本字符串
el = etree.Element("someelement")
el.text = 'Disponible à partir du 1er Octobre'

我收到错误:

  

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

我也试过了:

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

但是我得到同样的错误。

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

如果文本包含非ascii数据,那么您应该将其作为el.text的Unicode字符串提供。

正如@Abbasov Alexander's answer所示,您可以使用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 sandwich:一旦收到字节就将字节解码为Unicode,在程序中使用Unicode文本,当需要使用不需要的API发送文本时尽可能晚地编码为字节不支持Unicode(文件,网络)。