当服务器的内容类型是"Content-Type:text/html"时.requests.get()返回不正确编码的数据.就好像我们将内容类型明确地称为'Content-Type:text/html; charset = utf-8',它返回正确的数据.
当我们使用urllib.urlopen()时,它返回正确的数据.以前有人注意到了吗?为什么requests.get()表现得像这样?
Dek*_*kel 17
来自请求文档:
当您发出请求时,Requests会根据HTTP标头对响应的编码进行有根据的猜测.当您访问r.text时,将使用由Requests猜测的文本编码.您可以使用r.encoding属性找出请求使用的编码,并进行更改.
>>> r.encoding
'utf-8'
>>> r.encoding = 'ISO-8859-1'
Run Code Online (Sandbox Code Playgroud)
检查用于您的页面的编码请求,如果它不正确 - 尝试强制它是您需要的.
关于之间的差异requests和urllib.urlopen-他们可能用不同的方式来猜测编码.就这样.
bub*_*bak 15
受过教育的猜测可能只是检查Content-Type服务器发送的标题(非常误导使用受过教育的 imho).
对于响应头Content-Type: text/html,结果是ISO-8859-1(HTML4的默认值),无论任何内容分析(即HTML5的默认值是UTF-8).
对于响应头Content-Type: text/html; charset=utf-8,结果为UTF-8.
对我们来说幸运的是,请求使用chardet库,并且通常可以很好地工作(属性requests.Response.apparent_encoding),所以你通常想做:
r = requests.get("https://martin.slouf.name/")
# override encoding by real educated guess as provided by chardet
r.encoding = r.apparent_encoding
# access the data
r.text
Run Code Online (Sandbox Code Playgroud)
Har*_*_pb 13
得到响应后,取response.content而不是,response.text那将是 encoding utf-8。
response = requests.get(download_link, auth=(myUsername, myPassword), headers={'User-Agent': 'Mozilla'})
print (response.encoding)
if response.status_code is 200:
body = response.content
else:
print ("Unable to get response with Code : %d " % (response.status_code))
Run Code Online (Sandbox Code Playgroud)
假定默认的text / html内容编码为ISO-8859-1,也就是Latin-1 :(请参阅RFC-2854。UTF-8太小而不能成为默认编码,它诞生于1993年,与HTML和HTTP。
使用.content访问字节流或.text访问解码Unicode流。如果HTTP服务器不关心正确的编码,则其值.text可能为off。
| 归档时间: |
|
| 查看次数: |
27961 次 |
| 最近记录: |