我通过使用Beautiful Soup库的a.get('href')
方法从网页中获取了一个链接。在链接中有一个奇怪的字符®
,但当我获取它时,它变成了®
。我该如何正确编码它?我已经在页面开头添加了# -*- coding: utf-8 -*-
。
r = requests.get(url)
soup = BeautifulSoup(r.text)
我通过使用Beautiful Soup库的a.get('href')
方法从网页中获取了一个链接。在链接中有一个奇怪的字符®
,但当我获取它时,它变成了®
。我该如何正确编码它?我已经在页面开头添加了# -*- coding: utf-8 -*-
。
r = requests.get(url)
soup = BeautifulSoup(r.text)
不要使用r.text
,将解码留给BeautifulSoup
:
soup = BeautifulSoup(r.content)
r.content
提供了未解码的字节响应。而r.text
则是将响应解码为unicode
。
问题在于服务器没有在响应标头中包含字符集。此时,requests
遵循HTTP RFC 2261,第3.7.1节:默认情况下,text/
响应应使用ISO-8859-1(Latin 1)字符集。
对于您的HTML页面,这个默认值是错误的,导致您得到了不正确的结果;r.text
将字节解码为Latin-1,导致出现了Mojibake:
>>> print u'®'.encode('utf8').decode('latin1')
®
HTML可以在HTML页面中的<meta>
标签中包含正确的编码格式。BeautifulSoup将使用该标头并为您解码字节。
即使缺少<meta>
标头标签,BeautifulSoup也包括其他方法来自动检测编码格式。