我通过使用美丽的汤库从网页获得链接a.get('href')
。链接中有一个奇怪的字符®
但当我得到它时,它变成了®
。我怎样才能正确地对其进行编码?我已经在页面开头添加了# -*- coding: utf-8 -*-
r = requests.get(url)
soup = BeautifulSoup(r.text)
Do not use r.text
;将解码留给BeautifulSoup
:
soup = BeautifulSoup(r.content)
r.content https://requests.readthedocs.io/en/latest/api/#requests.Response.content为您提供以字节为单位的响应,无需解码。r.text https://requests.readthedocs.io/en/latest/api/#requests.Response.text另一方面,响应被解码为unicode
.
发生的情况是服务器未在响应标头中包含字符集。那一刻,requests
遵循HTTP RFC 2261,第 3.7.1 节 http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7.1: text/
回应默认情况下预计将使用 ISO-8859-1 (Latin 1) 字符集。
对于您的 HTML 页面,该默认值是错误的,并且您得到了不正确的结果;r.text
将字节解码为 Latin-1,结果是Mojibake http://en.wikipedia.org/wiki/Mojibake:
>>> print u'®'.encode('utf8').decode('latin1')
®
HTML 本身可以包含正确的编码在 HTML 页面本身中,形式为<meta> tag https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta在 HTML 标头中。 BeautifulSoup 将使用该标头并为您解码字节。
即使<meta>
header 标签丢失,BeautifulSoup 包含其他方法自动检测编码 http://www.crummy.com/software/BeautifulSoup/bs4/doc/#encodings.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)