Python UnicodeEncodeError / Wikipedia-API

时间:2012-11-17 17:33:51

标签: python unicode encoding ascii wikipedia-api

我试图用Python和BeautifulSoup解析这个文档:

http://en.wikipedia.org/w/api.php?format=xml&action=opensearch&search=rage_against_the_machine

将第七个项目作为此Text标记:

  

对机器的愤怒1994-1995   游

当我尝试打印出“Rage Against the Machine's 1994-1995 Tour”时,python正在给我这个:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 31: ordinal not in range(128)

我可以通过简单地用' - '替换你'''来解决它:

itemText = itemText.replace(u'\u2013', '-')

然而,我没有编码的每个角色呢?我不想忽略它们,也不想列出所有可能的查找和替换。

当然必须存在一个库来尝试从最常见的已知编码列表中检测编码(但可能是错误的)。

someText = getTextWithUnknownEncoding(someLocation);
bestAsciiAttemptText = someLibrary.tryYourBestToConvertToAscii(someText)

谢谢

3 个答案:

答案 0 :(得分:1)

将其解码为UTF-8应该有效:

itemText = itemText.decode('utf-8')

答案 1 :(得分:0)

通常,您应该尝试将字符保存为unicode或utf-8 。避免将字符转换为本地代码页,因为这会导致信息丢失。

然而,如果你必须,这里是。很少有事情要做。让我们使用你的示例角色:

>>> s = u'\u2013'

如果要打印字符串,例如对于调试,您可以使用repr

>>> print(repr(s))
u'\u2013'

在交互式会话中,您只需键入变量名称即可获得相同的结果:

>>> s
u'\u2013'

如果您确实要将文本转换为本地代码页,并且可以将此代码页外的字符转换为“?”,则可以使用:

>>> s.encode('latin-1', 'replace')
'?'

如果'?'不够好,您可以使用translate将所选字符转换为与this answer中相同的字符。

答案 2 :(得分:-2)

您可能需要明确声明您的编码。

在文件的第一行(或者在hashbang之后,如果有的话),添加以下行:

-*- coding: utf-8 -*-

这个“魔术评论”迫使Python期望UTF-8字符,并且应该成功解码它们。

更多详情:http://www.python.org/dev/peps/pep-0263/