首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >忽略Python中的编码错误(迭代解析)?

忽略Python中的编码错误(迭代解析)?
EN

Stack Overflow用户
提问于 2012-02-11 18:48:48
回答 5查看 9.3K关注 0票数 3

我已经跟这个吵了一个小时了。我正在用iterparse解析一个XML-字符串。但是,数据没有正确地编码,我也不是它的提供者,所以我无法修复编码。

以下是我遇到的错误:

代码语言:javascript
复制
lxml.etree.XMLSyntaxError: line 8167: Input is not proper UTF-8, indicate encoding !
Bytes: 0xEA 0x76 0x65 0x73

我怎么能简单地忽略这个错误而仍然继续解析呢?我不介意,如果没有正确保存一个字符,我只需要数据。

以下是我尝试过的,都是从互联网上挑选出来的:

代码语言:javascript
复制
data = data.encode('UTF-8','ignore')
data = unicode(data,errors='ignore')
data = unicode(data.strip(codecs.BOM_UTF8), 'utf-8', errors='ignore')

编辑:

我无法显示url,因为它是一个私有API,涉及我的API密钥,但我是这样获得数据的:

代码语言:javascript
复制
ur = urlopen(url)
data = ur.read()

导致这个问题的原因是:å,我猜äö等等也会破坏它。

下面是我试图解析它的部分:

代码语言:javascript
复制
def fast_iter(context, func):
    for event, elem in context:
        func(elem)
        elem.clear()
        while elem.getprevious() is not None:
            del elem.getparent()[0]
    del context

def process_element(elem):
    print elem.xpath('title/text( )')

context = etree.iterparse(StringIO(data), tag='item')
fast_iter(context, process_element)

编辑2:

当我尝试在PHP中解析它时,就是发生的事情。为了澄清,F*ing a l是一个戏剧电影 =D

该文件以<?xml version="1.0" encoding="UTF-8" ?>开头

这是我从print repr(data[offset-10:offset+60])那里得到的

代码语言:javascript
复制
ence des r\xeaves, La</title>\n\t\t<year>2006</year>\n\t\t<imdb>0354899</imdb>\n
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-11 23:14:23

你说:

造成这一问题的原因是:

你怎么知道的?你用什么看你的短信?

所以您不能发布URL和API键;那么读取数据、将其写入文件(以二进制模式)并发布该数据又如何呢?

当您在web浏览器中打开该文件时,它检测到了什么编码?

至少,做这个

代码语言:javascript
复制
data.decode('utf8') # where data is what you get from ur.read()

这将产生一个异常,它将告诉您非UTF-8的字节偏移量。

然后这样做:

print repr(data[offset-10:offset+60])

给我们看看结果。

假设编码实际上是cp1252,并解码lxml错误消息中的字节:

代码语言:javascript
复制
>>> guff = "\xEA\x76\x65\x73"
>>> from unicodedata import name
>>> [name(c) for c in guff.decode('1252')]
['LATIN SMALL LETTER E WITH CIRCUMFLEX', 'LATIN SMALL LETTER V', 'LATIN SMALL LE
TTER E', 'LATIN SMALL LETTER S']
>>>

那么,你看到的是电子回旋之后的ves,还是跟着ves的环,还是后面跟着其他东西的环呢?

数据是否以像<?xml version="1.0" encoding="UTF-8"?>这样的XML声明开始?如果没有,从什么开始呢?

编码猜测/确认的线索:文本是用什么语言写的?哪个国家?

根据提供的进一步信息更新

根据您在错误附近显示的片段,电影标题是"La science des r状语“(梦的科学)。

有趣的是,PHP如何在“F*ing on l”上插嘴,但Python却扼杀了法国梦。您确定您执行了相同的查询吗?

你应该事先告诉我们这是IMDB,你会很快得到答案的。

在将解决方案传递给lxml解析器之前,请执行以下操作:

代码语言:javascript
复制
data = data.replace('encoding="UTF-8"', 'encoding="iso-8859-1"')

这是基于他们在自己的网站上声明的编码,但这也可能是一个谎言。在这种情况下,尝试cp1252代替。绝对是,不是iso-8859-2.

票数 3
EN

Stack Overflow用户

发布于 2012-02-11 20:46:04

但是,数据没有正确地编码,我也不是它的提供者,所以我无法修复编码。

它以某种方式被编码为。确定编码,并指定编码,而不是UTF-8编码(因为这显然不是编码)。

票数 0
EN

Stack Overflow用户

发布于 2019-05-18 11:22:37

Iterparse允许您使用它的关键字-参数“编码”(参见https://lxml.de/api/lxml.etree.iterparse-class.html)覆盖文档中的xml编码。在上面的代码中,您还可以编写

代码语言:javascript
复制
context = etree.iterparse(StringIO(data), tag='item', encoding='iso-8859-1') 

处理文件中的所有欧洲字符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9243005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档