我需要使用python的requests 下载一些文件,但是文件是中文名的
chrome调试看出来的文件名是
Content-Disposition:attachment; filename=%C9%F1%BC%B6%BB%F5%C0%C9.txt
requests 下载显示的却是乱码
import requests
url = 'http://www.23us.so/modules/article/txtarticle.php?id=156'
req = requests.head(url)
headers = req.headers
print( headers.get('Content-Disposition'))
>> attachment; filename=ÇàÔÆÏÉ·.txt
我试过设置req.encoding 没有效果
怎么把header中的文字恢复出来,requests中似乎没有相关方法
各位可以调试一下
咳咳, 你应该早点放出具体链接地址的, 我跟进下方法, 放码:
结果:
你让
req.encoding
自己猜目标的编码方式即可.requests
模块的models.py
第 769 行注释说的很清楚, 人家可以自动检测目标网页内容的编码类型, 而具体负责检测编码的代码在这里universaldetector.py
所以我们只需要利用下这个特性编码然后再按
utf-8
解码即可, 看代码:结果:
你把 headers 全部显示出来看看,应该有个 charset 属性。
更新
这个其实是 URI encode,是从 unicode转义得来的。
解码例子如下:
结果:
짱벶믵색
짱벶믵색
是韩文~~
再更
后来仔细想了想,也可能是别的编码格式,就拿
gb2312
试一下。结果是:
觉得这个更靠谱些~
这些方法,在urllib都有,分别是:
quote
,unquote
例子:
结果是:
三更
我在讲解原理~
在不知道
charset
的情况下,只能猜;requests也是用chardet
进行猜测。而且,@ferstar 所说的
req.encoding
是用于响应体(Response.content)
的,并不能用于headers
。在提问者没提供代码和网页链接之前,我只能用提问者给的数据:
仔细看,这是个
字符串
,不是bytes
!所以req.encoding
是无效的。前面我也提到过,这其实是个
URI
,从原字符的某个编码转义而来。%
是URI
的转义符。还原的方法在上面我已经写了,结果也是正确的。
为什么不采纳正确的答案呢?
为什么不采纳正确的答案呢?
为什么不采纳正确的答案呢?
四
本来不想更此帖了,但@ferstar 评论了一大段,不回就有点不合适了~
引用@ferstar 的评论,完毕
SF的内容更新是有历史版本记录的,翻出来对比一下。
提问者:ider
回答:同意并接受
回答:ferstar
在我更新了正确答案#r3之后
3
小时,@ider 更新了问题#r4,并采纳
了@ferstar 的第一版错误答案#r1。采纳
之后,我在评论中提出异议,@ferstar 更新了第二版答案#r2。而且,@ferstar 的第二版答案依然是错误的
但是,为什么@ferstar 的第二版答案会得出正确的结果呢?
🎜 🎜再更🎜 🎜后来仔细想了想,也可能是别的编码格式,就拿因为之前我找到了正确编码
gb2312
,他不过是替换成兼容编码gbk
是韩文~~gb2312
试一下。🎜 rrreee 🎜结果是:🎜 rrreee 🎜觉得这个更靠谱些~🎜这些方法,在urllib都有,分别是:quote
,unquote
🎜例子:🎜 rrreee 🎜结果是:🎜 rrreee 🎜 🎜三更🎜 🎜我在讲解原理~🎜在不知道charset
的情况下,只能猜;requests也是用chardet
进行猜测。🎜而且,@ferstar 所说的req.encoding
是用于响应体(Response.content)
的,并不能用于headers
。🎜在提问者没提供代码和网页链接之前,我只能用提问者给的数据:🎜 🎜仔细看,这是个字符串
,不是bytes
!所以req.encoding
是无效的。🎜前面我也提到过,这其实是个URI
,从原字符的某个编码转义而来。%
是URI
的转义符。🎜还原的方法在上面我已经写了,结果也是正确的。🎜 🎜为什么不采纳正确的答案呢?🎜 🎜为什么不采纳正确的答案呢?🎜 🎜为什么不采纳正确的答案呢?🎜 🎜 🎜四🎜 🎜本来不想更此帖了,但@ferstar 评论了一大段,不回就有点不合适了~🎜 🎜引用@ferstar 的评论,完毕🎜 🎜SF的内容更新是有历史版本记录的,翻出来对比一下。🎜提问者:ider🎜回答:同意并接受🎜回答:ferstar🎜 🎜在我更新了正确答案#r3之后3
小时,@ider 更新了问题#r4,并采纳
了@ferstar 的第一版错误答案#r1。🎜采纳
之后,我在评论中提出异议,@ferstar 更新了第二版答案#r2。🎜而且,@ferstar 的第二版答案依然是错误的🎜 🎜但是,为什么@ferstar 的第二版答案会得出正确的结果呢?🎜因为之前我找到了正确编码gb2312
,他不过是替换成兼容编码gbk
而已。🎜再说说
req.encoding
不能作用于headers
。这个结论依然没变。这是由http原理决定的,
headers
先于body
。至于这个程序正确的写法,我也懒得解释和更新了,累!
除非,@ider 重新采纳我的答案,还有可能考虑一下~~
你的文件名是使用 gb2312编码的,你解码也需要设置 按照gb2312 解码,如果按照utf-8解码,就会出现乱码。可能你设置过的解码,默认按照utf-8解码的