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

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

黄舟
黄舟

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

全員に返信(3)
小葫芦

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

リーリー

結果:

リーリー

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

結果:

リーリー

いいねを押す +0
伊谢尔伦

すべてのヘッダーを表示すると、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
洪涛

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

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!