cari

Rumah  >  Soal Jawab  >  teks badan

python - requests headers 解码

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

黄舟黄舟2803 hari yang lalu878

membalas semua(3)saya akan balas

  • 高洛峰

    高洛峰2017-04-18 09:37:48

    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"}}
    

    balas
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:37:48

    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~~

    balas
    0
  • PHP中文网

    PHP中文网2017-04-18 09:37:48

    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

    balas
    0
  • Batalbalas