UTF-8中字符的编码问题

3 投票
1 回答
2007 浏览
提问于 2025-04-18 13:36

我通过使用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 也有其他方法可以 自动检测编码

撰写回答