iterparse和unicode[英] iterparse and unicode

问题描述

似乎 xml.etree.cElementTree.iterparse() 不支持 unicode:

>>from StringIO import StringIO
from xml.etree.cElementTree import iterparse
s = u''<name>\u03a0\u03b1\u03bd\u03b1\u03b3\u03b9\u03ce \u03c4\u03b7\u03c2''
for event,elem in iterparse(StringIO(s)):
.... 打印 elem.text
....
Traceback(最近一次通话最后一次):
文件"<stdin>",第 1 行,在 <module>
文件"<string>",第 64 行,在 __iter__
UnicodeEncodeError: ''ascii'' codec can't encoding characters in position
6-15:序数不在范围内(128)

是我用错了还是目前不支持unicode?

George

推荐答案

8 月 21 日上午 8:36,George Sakkis <george.sak...@gmail.com 写道:
似乎 xml.etree.cElementTree.iterparse() 不支持 unicode:
>from StringIO import StringIO
from xml.etree.cElementTree import iterparse
s = u''<name>\u03a0\u03b1\u03bd\u03b1\u03b3\u03b9\u03ce \u03c4\u03b7\u03c2''
for event,elem in iterparse(StringIO(s)):

... 打印 elem.text
...
Traceback(最近一次通话最后一次):
文件"<stdin>",第 1 行,在 <module>
文件"<string>",第 64 行,在 __iter__
UnicodeEncodeError: ''ascii'' codec can't encoding characters in position
6-15:序数不在范围内(128)

我使用不正确还是它目前不支持 unicode ?
嗨,乔治,
我无论如何都不是 XML 专家,但据我了解,您会
需要将您的文本编码为 UTF-8,并在前面加上 ''<?xml
版本="1.0";编码="UTF-8";独立="是"?>"".这出现了
成为 XML 的方式,而不是 ElementTree 问题.

例如
>>from StringIO import StringIO
from xml.etree.cElementTree import iterparse
s = u''<wrapper><name>\u03a0\u03b1</name><digits>01234567</digits></wrapper>''
>>h = ''<?xml 版本="1.0"编码="UTF-8";Standalone="yes"?>''
xml = h + s.encode(''utf8'')
for event,elem in iterparse(StringIO(xml)):
.... 打印 elem.tag, repr(elem.text)
....
名字你''\u03a0\u03b1''
数字''01234567''
包装器 无
>>>
HTH,
约翰

2008 年 8 月 20 日星期三 15:36 -0700,乔治·萨基斯写道:
似乎 xml.etree.cElementTree.iterparse() 不支持 unicode:
>from StringIO import StringIO
from xml.etree.cElementTree import iterparse
s = u''<name>\u03a0\u03b1\u03bd\u03b1\u03b3\u03b9\u03ce \u03c4\u03b7\u03c2''
for event,elem in iterparse(StringIO(s)):
... 打印 elem.text
...
Traceback(最近一次通话最后一次):
文件"<stdin>",第 1 行,在 <module>
文件"<string>",第 64 行,在 __iter__
UnicodeEncodeError: ''ascii'' codec can't encoding characters in position
6-15:序数不在范围内(128)

是我用错了还是目前不支持unicode?

乔治
--
http://mail.python.org/mailman/listinfo/python-list
由于 iterparse 需要一个实际的文件作为输入,所以使用 unicode 字符串是
有问题的.如果你想使用iterparse,最简单的方法是
在将字符串插入 StringIO 对象之前对其进行编码,如下所示:

???>>for event,elem in iterparse(StringIO(s.encode(''UTF8'')):
.... 打印 elem.text
....

如果使用 UTF-8 编码,则无需担心 <?xml 标头
有点像之前建议的那样,因为它是 XML 的默认设置.

如果你广泛使用 unicode,你应该考虑使用 lxml,
它实现与 ElementTree 相同的接口,但处理 unicode
更好(虽然它也不会在没有 first
的情况下运行上面的示例编码字符串):
http://codespeak.net/lxml/parsing.ht...nicode-strings

您可能还会发现目标解析器接口更容易接受
unicode 比 iterparse,虽然它需要不同的解析接口:
http://codespeak.net/lxml/parsing.ht...rser-interface

--
约翰克鲁科夫<jk******@ltgc.com>
土地产权担保公司


感谢两位的建议.我又做了几个实验
了解 iterparse 在三个维度上的行为:

一个.是否在标头中声明了编码(如果有)?
湾.文本是否可进行 ascii 编码(即在 range(128) 内)?
C.传递的文件对象的read()方法返回str还是unicode
(例如 codecs.open(f,encoding=''utf8'')) ?

如果我误解了真正发生的事情,请随时纠正我.

正如 John Krukoff 提到的,省略编码相当于
编码="utf-8";对于所有其他组合.剩下 (b) 和 (c).

如果文本节点是 ascii 编码的,iterparse() 将其作为字节返回
字符串,不管声明的编码和输入文件的
read() 返回类型.

(c) 仅当文本节点不可进行 ascii 编码时才相关.在
如果底层文件的 read()
在这种情况下 iterparse() 返回 unicode以匹配的编码返回字节(或至少兼容
with) 标头中声明的编码(或隐含的 utf8).
传递 read() 返回 unicode 字符的文件对象
将它们隐式编码为 ascii,这会引发 UnicodeEncodeError
因为文本节点不是 ascii 编码的.

有趣的是成功后的元素文本属性
parse 不一定具有相同的类型,即全部为 str 或 all
统一码.我从 BeautifulSoup 移植了一些文本提取代码(
将所有文本作为 unicode 处理),我很惊讶地发现在
xml.etree 返回文本的类型不固定,即使在同一个
文件.虽然这不是一个错误,但有一个混合的字节集合和
来自同一来源的 unicode 字符串让我有些不安.

乔治

本文地址:https://www.itbaoku.cn/post/1050782.html