Python输出中的俄语符号已损坏(编码)

时间:2014-11-11 16:42:24

标签: python encoding utf-8 cyrillic mojibake

我解析了一个HTML文档并在其中包含俄文文本。当我试图在Python中打印时,我明白了:

ÐлÑбниÑнÑй новогодний пÑнÑ

我试图解码它,我得到了ISO-8859-1编码。我试图像这样解码它:

print drink_name.decode('iso8859-1')

但是我收到了一个错误。如何打印此文本,或在Unicode

中对其进行编码

1 个答案:

答案 0 :(得分:3)

你有Mojibake;在这种情况下,UTF-8字节被解码为Latin-1或CP1251。

您可以通过撤消流程来修复它:

>>> print u'ÐлÑбниÑнÑй новогодний пÑнÑ'.encode('latin1').decode('utf8')
Клубничный новогодний пунш

(我必须从原始帖子源复制字符串以捕获Mojibake中所有不可打印的字节)。

更好的方法是首先不正确解码。您使用错误的编码解码原始文本,而是使用UTF-8作为编解码器。

如果您使用requests下载页面,请不要在这种情况下使用response.text;如果服务器未能使用特定的编解码器,则HTTP RFC默认使用Latin-1,但HTML文档通常将编码嵌入<meta>标头中。在这种情况下将解码保留给解析器,例如BeautifulSoup:

response = requests.get(url)
soup = BeautifulSoup(response.content)  # pass in undecoded bytes