Python输出的俄语符号被破坏了(编码问题)

4

我解析了一个HTML文档,其中有俄语文本。当我试着在Python中打印它时,我得到了这个结果:

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

我试图对其进行解码,结果得到了ISO-8859-1编码。我尝试这样进行解码:

print drink_name.decode('iso8859-1')

但是我遇到了错误。我应该如何打印这段文本,或者将它编码为Unicode


你不需要将它编码为Unicode,而是需要将其解码为Unicode。 - wim
请在最初解析HTML文档时包含您使用的代码,这样我们就可以帮助您避免第一次犯这个错误。 - Martijn Pieters
答案可能在这里:(https://dev59.com/rmox5IYBdhLWcg3wYzfX)。它对我很有帮助。 - E1ko0o
1个回答

4
你遇到了乱码问题;在这种情况下,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

好的,这个有效。谢谢。我会在10分钟内接受答案。 - aaaapppp
print drink_name.encode('latin1') 即使这样也可以很好地工作。另外,你怎么知道这是乱码? - aaaapppp
@aaaapppp:只有在终端配置为UTF-8时才有效。你不能总是依赖它。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接