【问题标题】:French and lxml text法语和 lxml 文本
【发布时间】:2013-06-16 21:53:07
【问题描述】:

我正在尝试使用 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() 函数中指定编码,但不能在元素中分配文本值。

【问题讨论】:

  • el.text = etree.CDATA(('Disponible à partir du 1er Octobre').decode('utf-8')) 或 el.text = ('Disponible à partir du 1er Octobre' ).decode('utf-8')

标签: python lxml


【解决方案1】:

如果文本包含非 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(文件、网络)。

【讨论】:

  • 这不是一个有点混乱的错误信息吗?用户实际上是在提供 Unicode UTF-8,它说它应该是 Unicode 或 Ascii。我认为如果它说 - 输入应该是带有 ascii 字符(或没有非 ascii 字符)的“unicode”或“str”类型会更清楚。
  • @Nishant:我同意。您可以在 lxml 的问题跟踪器上提出更好的措辞。不过,在 Python 3 上,它对应的是 strbytes 类型。如果从答案中不清楚;我的建议:始终使用 Unicode(Python 2 上的unicode,Python 3 上的str)来表示文本。不要对 ASCII 文本使用令人困惑的 bytes 优化。无论如何,在最近的 Python 版本中,仅包含 ascii 的 Unicode 字符串不会消耗更多内存(由于 Python 3.3+ 中 Unicode 字符串的灵活表示),即优化变得更没有意义了。
【解决方案2】:

如果你有 python el.text = u'Disponible à partir du 1er Octobre'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2011-07-15
    • 2010-11-25
    • 2012-07-25
    • 2022-01-23
    相关资源
    最近更新 更多