【问题标题】:Python UnicodeEncodeError / Wikipedia-APIPython UnicodeEncodeError / Wikipedia-API
【发布时间】:2012-11-06 03:31:22
【问题描述】:

我正在尝试使用 Python 和 BeautifulSoup 解析此文档:

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

第七个Item作为这个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)

我可以通过简单地将 u'\u2013' 替换为 '-' 来解决它,如下所示:

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

但是,我没有编码的每个字符呢?我不想忽略它们,也不想列出所有可能的查找和替换。

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

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

谢谢

【问题讨论】:

  • 你在 Windows 上吗?
  • 如何打印文本?到终端,到文件?你在任何地方连接 (str1 + str2) 吗?
  • 我在 Windows 7 上,我正在直接打印到终端
  • 该链接建议使用不起作用的 .encode('utf-8') 。它给了我同样的错误。

标签: python unicode encoding ascii wikipedia-api


【解决方案1】:

将其解码为 UTF-8 应该可以:

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

【讨论】:

  • 通常,Python 会检测终端编解码器。盲目地编码为 UTF-8 在这里没有帮助。
【解决方案2】:

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

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

-*- coding: utf-8 -*-

这个“神奇的注释”迫使 Python 期待 UTF-8 字符并且应该成功解码它们。

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

【讨论】:

  • 该注释仅适用于阅读源码,与输出编码无关。
  • 这不会改变源的行为。
【解决方案3】:

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

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

>>> s = u'\u2013'

如果你想打印字符串,例如调试可以使用repr:

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

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

>>> s
u'\u2013'

如果你真的想把文本转换成你本地的代码页,并且这个代码页之外的字符转换成'?'就可以了,你可以这样:

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

如果“?”不够好,您可以使用translate 将选定的字符转换为与this answer 中的等效字符。

【讨论】:

    猜你喜欢
    • 2014-07-25
    • 2014-07-20
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多