如何解决Unicode的错误xml.etree.ElementTree.iterparse

 我来答
匿名用户
2016-04-10
展开全部
Traceback (most recent call last):
File "<path to above file>", line 26, in foo
for (event, elem) in xmlit:
File "C:\Python32\lib\xml\etree\ElementTree.py", line 1314, in __next__
self._parser.feed(data)
File "C:\Python32\lib\xml\etree\ElementTree.py", line 1668, in feed
self._parser.Parse(data, 0)
UnicodeEncodeError: 'utf-8' codec can't encode character '\ud800' in position 16383: surrogates not allowed

由于出现错误之间for循环迭代,我可以包装一个唯一的地方try块以外的for循环,这是我无法继续到下一个XML 是我的一个解决方案的优先事项如下: 接收,而不必引发异常的未必然,有效的Unicode字符串作为文本。 收到一个有效的Unicode字符串的字符无效更换或取出。 跳过的无效字符 CodeGo.net,并移动到下一个。 我怎么能这些解决方案中,而不必和修改ElementTree编写自己?
本文地址 :CodeGo.net/9075227/
-------------------------------------------------------------------------------------------------------------------------
1.首先,所有的东西对可能这里无关紧要。尝试仅仅通过返回的文件f = open(filename, encoding='utf-8')如果是的话,解决的办法是重写默认编码错误处理程序,如在文档解释说: 错误是一个可选的字符串,用于指定编码和解码的错误是如何被handled,Äìthis不能以二进制方式。经过“strict”提出一个ValueError异常,如果有一个编码错误(没有默认有作用),或者通过“忽略”忽略错误。 (请注意 CodeGo.net,忽略编码错误会导致数据丢失。)'代替'的标记(如“?”)插入那里的数据。写作时,“xmlcharrefreplace”(替换为相应的XML字符引用)或“backslashreplace'(用反斜杠转义序列替换)可以在已注册codecs.register_error()其他错误处理也是有效的。 所以,你可以这样做:f = open(filename, encoding='utf-8', errors='replace')

这符合你的第二个priority,Äîthe无效字符将被替换'?'。 有没有办法来满足你的首要任务,有没有办法来表示“不必然,有效的Unicode字符串”.a个Unicode字符串,顾名思义,对Unicode代码点的序列,这就是Python中如何对待str类型。如果你有无效的UTF-8,并希望把它转换成一个字符串,你需要指定应该如何变成string,Äîand那是什么,errors是。 你可以,或者,以二进制方式打开该文件,息事宁人为UTF-8作为bytes对象,而不是试图把它变成一个Unicodestr反对,但你可以在与工作的APIbytes对象。 (我相信lxml的ElementTree能真正做到这一点,但内置一不可,但不要说)。但即使你这样做,它不会让你很远.xML代码本身将试图解释无效的UTF-8,然后它需要知道你想要做什么样的错误,而这将是很难说明它的更远了。 最后一点: 因为发生错误的for循环迭代之间,唯一的地方,我可以换一个try块外循环,这是我无法继续到下一个XML 那么,你实际上并不具有for环;你可以把它变成一个while环路明确next调用。所有你需要做这个,我知道你正在做wrong,Äîbut那就是你正在处理一个破碎库的标志,它是唯一可用的解决方法的一个标志。 这一点:for (event, elem) in xmlit: # line 26
doStuffWith(event, elem)

实际上等同于:while True:
try:
event, elem = next(xmlit)
except StopIteration:
break
doStuffWith(event, elem)

而现在,有添加的地方try,Äîalthough你甚至不真正需要;你可以附加其他except在现有try。 问题是,你有什么打算在这里做?谁也不能保证iterator就可以继续它抛出一个异常后。事实上,所有的最简单的方法来创建iterator将不能够这样做。你可以为自己测试是否这是真的在这种情况下。 在极少数情况下,当你需要这个,而它实际上帮助,你可能想要把它包起来。像这样:def skip_exceptions(it):
while True:
try:
yield next(it)
except StopIteration:
raise
except Exception as e:
logging.info('Skipping iteration because of exception {}'.format(e))

然后,你只是做:for (event, elem) in skip_exceptions(xmlit):
doStuffWith(event, elem)

本文标题 :如何解决Unicode的错误xml.etree.ElementTree.iterparse()?
本文地址 :CodeGo.net/9075227/
1. sqlite3的ORDER BY需要时间
2. 只有在Emacs的Python命令行为什么UnicodeEncodeError长大的吗?
3. Memcached的不尊重的元组排序
4. 解析HTML使用QWebElement,如何提取图像?
5. 在__init__中声明的变量似乎是类实例之间共享?
6. Python 2.6中 我有两个文件。SysDump.py和li
7. 为什么一个特定的导入看到其他导入? Python 2.6中
8. 创建具有PyGTK的屏幕保护程序的使用XScreenSaver
9. 与目录工作|python
10. 从字符串转换为元组和QUOT; \\&QUOT;在python
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式