我需要使用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中似乎没有相关方法
各位可以调试一下
Ahem, anda sepatutnya telah mengeluarkan alamat pautan tertentu sebelum ini saya akan membuat susulan tentang kaedah dan meletakkan kod:
Keputusan:
Anda hanya boleh membiarkan
req.encoding
meneka kaedah pengekodan sasaran Ulasan pada baris 769modul
requests
models.py
menjadikannya sangat jelas bahawa orang boleh mengesan jenis pengekodan secara automatik. kandungan halaman web sasaran, dan khusus Kod yang bertanggungjawab untuk mengesan pengekodan ada di siniuniversaldetector.py
, jadi kami hanya perlu menggunakan ciri ini untuk mengekod dan kemudian tekan
utf-8
untuk menyahkod:Keputusan:
Tunjukkan semua pengepala dan lihat harus ada atribut charset.
Kemas kini
Ini sebenarnya pengekodan URI, yang terlepas daripada unicode.
Contoh penyahkodan adalah seperti berikut:
Keputusan:
짱벶믵색
ialah bahasa Korea~~
Lagi kemas kini
Setelah memikirkannya dengan teliti, ia mungkin format pengekodan lain, jadi saya mencubanya dengan
gb2312
.Hasilnya ialah:
Saya rasa ini lebih dipercayai~
Kaedah ini tersedia dalam urllib, iaitu:
quote
,unquote
Contoh:
Hasilnya ialah:
Tiga kemas kini
Saya menerangkan prinsipnya~
Apabila anda tidak tahu
charset
, anda hanya boleh teka; permintaan juga menggunakanchardet
untuk meneka.Selain itu, apa yang @ferstar katakan
req.encoding
adalah untuk响应体(Response.content)
, bukan untukheaders
.Sebelum Asker tidak memberikan kod dan pautan web, saya hanya boleh menggunakan data yang diberikan oleh Asker:
Lihat dengan teliti, ini adalah
字符串
, bukanbytes
! Jadireq.encoding
tidak sah.Seperti yang saya nyatakan sebelum ini, ini sebenarnya adalah
URI
, yang terlepas daripada pengekodan tertentu watak asal .%
ialahURI
watak melarikan diri untuk .Saya sudah menulis kaedah pemulihan di atas, dan hasilnya betul.
Mengapa tidak menerima jawapan yang betul?
Mengapa tidak menerima jawapan yang betul?
Mengapa tidak menerima jawapan yang betul?
Empat
Saya tidak mahu mengemas kini siaran ini, tetapi @ferstar membuat ulasan panjang, jadi adalah tidak wajar untuk tidak membalas~
Memetik ulasan @ferstar, selesai
Kemas kini kandungan SF mempunyai rekod versi sejarah, lihat dan bandingkannya.
Penanya: ider
Jawapan: Setuju dan terima
Jawapan: ferstar
3
jam selepas saya mengemas kini jawapan yang betul #r3, @ider mengemas kini soalan #r4 dengan采纳
versi pertama @ferstar bagi jawapan salah #r1.采纳
Selepas itu, saya membangkitkan bantahan dalam komen dan @ferstar mengemas kini versi kedua jawapan #r2.Juga, jawapan kedua @ferstar masih salah
Tetapi mengapa versi kedua jawapan @ferstar memberikan hasil yang betul?
Disebabkan saya jumpa pengekodan yang betul
gb2312
sebelum ini, dia cuma menggantikannya dengan pengekodan yang serasigbk
.Selain itu,
req.encoding
tidak boleh bertindak padaheaders
.Kesimpulan ini kekal tidak berubah. Ini ditentukan oleh prinsip http,
headers
mendahuluibody
.Bagi cara yang betul untuk menulis program ini, saya terlalu malas untuk menerangkan dan mengemas kininya, penat!
Melainkan @ider mengguna pakai semula jawapan saya, saya mungkin mempertimbangkannya~~
Nama fail anda dikodkan menggunakan gb2312, dan penyahkodan anda juga perlu ditetapkan untuk menyahkod mengikut gb2312 Jika dinyahkod mengikut utf-8, aksara yang bercelaru akan muncul. Mungkin anda telah menetapkan penyahkodan untuk menyahkod mengikut utf-8 secara lalai