我试图用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)
谢谢
答案 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字符,并且应该成功解码它们。