python - requests headers 解码
黄舟
黄舟 2017-04-18 09:35:48
0
3
865

我需要使用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中似乎没有相关方法
各位可以调试一下

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

membalas semua(3)
小葫芦

Ahem, anda sepatutnya telah mengeluarkan alamat pautan tertentu sebelum ini saya akan membuat susulan tentang kaedah dan meletakkan kod:

url = 'http://www.23us.so/modules/article/txtarticle.php?id=156'
req = requests.head(url)
headers = req.headers
print(headers.get('Content-Disposition').encode(req.encoding).decode('gbk'))  # gb2312也可以正确解码

Keputusan:

attachment; filename=青云仙路.txt

Anda hanya boleh membiarkan req.encoding meneka kaedah pengekodan sasaran Ulasan pada baris 769
modul requestsmodels.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 sini universaldetector.py
, jadi kami hanya perlu menggunakan ciri ini untuk mengekod dan kemudian tekan utf-8 untuk menyahkod:

import requests


url = "http://www.weather.com.cn/data/cityinfo/101010100.html"
req = requests.get(url)
print(req.text)
print(req.encoding)
print(req.text.encode(req.encoding))
print(req.text.encode(req.encoding).decode('utf-8'))

Keputusan:

{"weatherinfo":{"city":"北京","cityid":"101010100","temp1":"-2℃","temp2":"16℃","weather":"晴","img1":"n0.gif","img2":"d0.gif","ptime":"18:00"}}
ISO-8859-1
b'{"weatherinfo":{"city":"\xe5\x8c\x97\xe4\xba\xac","cityid":"101010100","temp1":"-2\xe2\x84\x83","temp2":"16\xe2\x84\x83","weather":"\xe6\x99\xb4","img1":"n0.gif","img2":"d0.gif","ptime":"18:00"}}'
{"weatherinfo":{"city":"北京","cityid":"101010100","temp1":"-2℃","temp2":"16℃","weather":"晴","img1":"n0.gif","img2":"d0.gif","ptime":"18:00"}}
伊谢尔伦

Tunjukkan semua pengepala dan lihat harus ada atribut charset.


Kemas kini

Ini sebenarnya pengekodan URI, yang terlepas daripada unicode.
Contoh penyahkodan adalah seperti berikut:

def decodeURI(strURI):
    strURI = strURI.replace('%','')
    URI = ''.join((chr(int(strURI[i:i+4],16)) for i in range(0,len(strURI),4)))
    return URI

n = '%C9%F1%BC%B6%BB%F5%C0%C9'
print(decodeURI(n))

Keputusan:

짱벶믵색
ialah bahasa Korea~~


Lagi kemas kini

Setelah memikirkannya dengan teliti, ia mungkin format pengekodan lain, jadi saya mencubanya dengan gb2312.

n = '%C9%F1%BC%B6%BB%F5%C0%C9'
print(bytes.fromhex(n.replace('%','')).decode('gb2312'))

Hasilnya ialah:

神级货郎

Saya rasa ini lebih dipercayai~
Kaedah ini tersedia dalam urllib, iaitu: quote, unquote
Contoh:

import urllib

n = 'filename=%C9%F1%BC%B6%BB%F5%C0%C9.txt'
filename = urllib.parse.unquote(n,encoding='gb2312')
print(filename)

Hasilnya ialah:

filename=神级货郎.txt

Tiga kemas kini

Saya menerangkan prinsipnya~
Apabila anda tidak tahu charset, anda hanya boleh teka; permintaan juga menggunakan chardet untuk meneka.
Selain itu, apa yang @ferstar katakan req.encoding adalah untuk 响应体(Response.content), bukan untuk headers.
Sebelum Asker tidak memberikan kod dan pautan web, saya hanya boleh menggunakan data yang diberikan oleh Asker:

nama fail=%C9%F1%BC%B6%BB%F5%C0%C9.txt

Lihat dengan teliti, ini adalah 字符串, bukan bytes! Jadi req.encoding tidak sah.
Seperti yang saya nyatakan sebelum ini, ini sebenarnya adalah URI, yang terlepas daripada pengekodan tertentu watak asal . % ialah URI 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~

Selepas penyoal mengemas kini dan menambah baik soalan, saya membuat susulan jawapan tepat pada masanya, dan saya dapat mendapatkan keputusan yang betul dan menyelesaikan masalah penyoal Ini adalah fakta sebelum penyoal menerima jawapan saya , jawapan anda seolah-olah tidak Tiada kemas kini, yang juga merupakan fakta Saya menyiarkan pelaksanaan khusus kod sumber yang sepadan sebelum ini, yang juga munasabah, dan ini adalah lebih benar kaedah req.encoding yang saya nyatakan; peranan, dan ia tidak berguna untuk pengepala seperti yang anda katakan Nampaknya benar

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 serasi gbk.

Selain itu, req.encoding tidak boleh bertindak pada headers.
Kesimpulan ini kekal tidak berubah. Ini ditentukan oleh prinsip http, headers mendahului body.

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan