ホームページ  >  に質問  >  本文

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

黄舟黄舟2741日前828

全員に返信(3)返信します

  • 高洛峰

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

    ああ、もっと早く特定のリンク アドレスを公開するべきでした。方法を追跡してコードを追加します。

    リーリー

    結果:

    リーリー

    req.encoding にターゲットのエンコード方式を推測させるだけで済みます。
    requests モジュールの models.py の 769 行目のコメントは、ターゲットのエンコード タイプを自動的に検出できることを明確に示しています。ターゲット Web ページのコンテンツ、および特定のエンコードの検出を担当するコードはここにあります universaldetector.py
    。したがって、この機能を使用してエンコードし、次に utf-8 を押してデコードするだけです。コードを参照してください。 > リーリー

    結果:

    リーリー

    返事
    0
  • 伊谢尔伦

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

    すべてのヘッダーを表示すると、charset 属性があるはずです。


    アップデート

    これは実際には Unicode からエスケープされた URI エンコードです。
    デコード例は次のとおりです:

    リーリー

    結果:

    짱벶믵색
    は韓国語です~~


    その他の最新情報

    よく考えたら別のエンコード形式かもしれないので、gb2312で試してみました。

    リーリー

    結果は次のとおりです:

    リーリー

    これはより信頼できると思います~
    これらのメソッドは urllib で使用できます。つまり、quoteunquote
    例:

    リーリー

    結果は次のとおりです:

    リーリー

    3 つのアップデート

    原理を説明しています~
    charsetが分からない場合は、推測することしかできません。リクエストも chardet を使用して推測します。
    また、@ferstar が req.encoding と言ったことは、响应体(Response.content) のためではなく、headers のためのものです。
    Asker がコードと Web リンクを提供しない前は、Asker から提供されたデータのみを使用できました:

    ファイル名=%C9%F1%BC%B6%BB%F5%C0%C9.txt

    よく見てください、これは 字符串 ではなく bytes です!したがって、req.encoding は無効です。
    前に述べたように、これは実際には、元の文字 URI の特定のエンコーディング からエスケープされた です。 % は、URI エスケープ文字 です。
    上記で復元方法をすでに書きましたが、結果は正しいです。

    なぜ正しい答えを受け入れないのでしょうか?

    なぜ正しい答えを受け入れないのでしょうか?

    なぜ正しい答えを受け入れないのでしょうか?


    4

    この投稿を更新したくなかったのですが、@ferstar が長いコメントをしたので、返信しないのは不適切です~

    質問者が質問を更新して改善した後、私は時間内に回答をフォローアップし、質問者が私の回答を受け入れる前に正しい結果を得ることができ、質問者の問題を解決することができました。 、あなたの答えはそうではないようです 更新はありません。これも事実です。以前に対応するソースコードの具体的な実装を投稿しましたが、これも合理的であり、これはさらに当てはまります。あなたが言ったように、ヘッダーには役に立たないというわけではないようです

    @ferstar のコメントを引用、完成

    SF コンテンツの更新には 歴史的なバージョンの記録 があり、それらを確認して比較してください。
    質問者: ider
    回答: 同意して受け入れます
    回答: ferstar

    私が正解 #r3 を更新してから

    3 時間後、@ider は質問 #r4 を更新し、不正解 #r1 の @ferstar の最初のバージョンを采纳再投稿しました。
    采纳その後、私はコメントで異議を唱え、@ferstar が回答 #r2 の 2 番目のバージョンを更新しました。
    また、@ferstar の 2 番目の回答 もまだ間違っています

    しかし、なぜ @ferstar の答えの 2 番目のバージョンが正しい結果を与えるのでしょうか?
    以前に正しいエンコーディング gb2312 を見つけたため、彼はそれを互換性のあるエンコーディング gbk に置き換えただけです。

    また、req.encodingheaders に対して行動することはできません。
    この結論は変わりません。これは http 原則によって決定され、headersbody に先行します。

    このプログラムの正しい書き方については、説明したり更新したりするのが面倒なので疲れています。
    @ider が私の回答を再採用しない限り、検討するかもしれません~~

    返事
    0
  • PHP中文网

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

    ファイル名は gb2312 でエンコードされており、デコードも gb2312 でデコードするように設定する必要があります。utf-8 でデコードすると文字化けが発生します。おそらく、デフォルトで utf-8 に従ってデコードするようにデコードを設定していると思われます

    返事
    0
  • キャンセル返事