UTF-8中字符的编码问题
我通过使用Beautiful Soup库,从网页中获取一个链接,方法是用 a.get('href')
。在这个链接里,有一个奇怪的字符 ®
,但是当我获取到它的时候,变成了 ®
。我该怎么正确编码呢?我已经在页面开头加上了 # -*- coding: utf-8 -*-
。
r = requests.get(url)
soup = BeautifulSoup(r.text)
1 个回答
6
不要使用 r.text
,让 BeautifulSoup
来处理解码:
soup = BeautifulSoup(r.content)
r.content
会给你返回原始的字节数据,没有进行解码。而 r.text
则是将这些字节解码成了 unicode
字符串。
出现问题的原因是服务器在响应头中没有包含字符集的信息。这时,requests
会按照 HTTP规范2261,第3.7.1节 的规定,默认认为 text/
类型的响应使用的是 ISO-8859-1(拉丁1)字符集。
对于你的HTML页面来说,这个默认设置是错误的,因此你得到了不正确的结果;r.text
将字节当作拉丁1进行解码,导致了 乱码:
>>> print u'®'.encode('utf8').decode('latin1')
®
HTML页面本身可以在页面中包含正确的编码信息,这通常是通过在HTML头部添加一个 <meta>
标签 来实现的。BeautifulSoup 会使用这个标签中的信息来为你解码字节。
即使 <meta>
标签缺失,BeautifulSoup 也有其他方法可以 自动检测编码。