2

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

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

第七项作为这个文本标签:

Rage Against the Machine 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)

谢谢

4

3 回答 3

1

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

itemText = itemText.decode('utf-8')
于 2012-11-17T17:36:16.607 回答
0

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

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

>>> s = u'\u2013'

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

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

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

>>> s
u'\u2013'

如果您真的想将文本转换为您的本地代码页,并且此代码页之外的字符转换为“?”是可以的,您可以使用以下命令:

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

如果 '?' 还不够好,您可以使用translate将所选字符转换为等效字符,如本答案所示

于 2013-03-11T22:38:40.730 回答
-2

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

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

-*- coding: utf-8 -*-

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

更多细节: http: //www.python.org/dev/peps/pep-0263/

于 2012-11-17T17:38:26.400 回答