我需要使用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中似乎没有相关方法
各位可以调试一下
ああ、もっと早く特定のリンク アドレスを公開するべきでした。方法を追跡してコードを追加します。
リーリー結果:
リーリー
結果:req.encoding
にターゲットのエンコード方式を推測させるだけで済みます。requests
モジュールのmodels.py
の 769 行目のコメントは、ターゲットのエンコード タイプを自動的に検出できることを明確に示しています。ターゲット Web ページのコンテンツ、および特定のエンコードの検出を担当するコードはここにありますuniversaldetector.py
。したがって、この機能を使用してエンコードし、次に
utf-8
を押してデコードするだけです。コードを参照してください。 > リーリーリーリー
すべてのヘッダーを表示すると、charset 属性があるはずです。
アップデート
これは実際には Unicode からエスケープされた URI エンコードです。
リーリーデコード例は次のとおりです:
結果:
짱벶믵색
は韓国語です~~
その他の最新情報
よく考えたら別のエンコード形式かもしれないので、
リーリーgb2312
で試してみました。結果は次のとおりです:
リーリーこれはより信頼できると思います~
リーリーこれらのメソッドは urllib で使用できます。つまり、
quote
、unquote
例:
結果は次のとおりです:
リーリー3 つのアップデート
原理を説明しています~
charset
が分からない場合は、推測することしかできません。リクエストもchardet
を使用して推測します。また、@ferstar が
req.encoding
と言ったことは、响应体(Response.content)
のためではなく、headers
のためのものです。Asker がコードと Web リンクを提供しない前は、Asker から提供されたデータのみを使用できました:
よく見てください、これは
字符串
ではなくbytes
です!したがって、req.encoding
は無効です。前に述べたように、これは実際には、元の文字
URI
の特定のエンコーディング からエスケープされた です。%
は、URI
の エスケープ文字 です。上記で復元方法をすでに書きましたが、結果は正しいです。
なぜ正しい答えを受け入れないのでしょうか?
なぜ正しい答えを受け入れないのでしょうか?
なぜ正しい答えを受け入れないのでしょうか?
4
この投稿を更新したくなかったのですが、@ferstar が長いコメントをしたので、返信しないのは不適切です~
。@ferstar のコメントを引用、完成
SF コンテンツの更新には 歴史的なバージョンの記録 があり、それらを確認して比較してください。
私が正解 #r3 を更新してから質問者: ider
回答: 同意して受け入れます
回答: ferstar
3
時間後、@ider は質問 #r4 を更新し、不正解 #r1 の @ferstar の最初のバージョンを采纳
再投稿しました。采纳
その後、私はコメントで異議を唱え、@ferstar が回答 #r2 の 2 番目のバージョンを更新しました。また、@ferstar の 2 番目の回答 もまだ間違っています
しかし、なぜ @ferstar の答えの 2 番目のバージョンが正しい結果を与えるのでしょうか?
以前に正しいエンコーディング
gb2312
を見つけたため、彼はそれを互換性のあるエンコーディングgbk
に置き換えただけです。また、
req.encoding
はheaders
に対して行動することはできません。この結論は変わりません。これは http 原則によって決定され、
headers
はbody
に先行します。このプログラムの正しい書き方については、説明したり更新したりするのが面倒なので疲れています。
@ider が私の回答を再採用しない限り、検討するかもしれません~~
ファイル名は gb2312 でエンコードされており、デコードも gb2312 でデコードするように設定する必要があります。utf-8 でデコードすると文字化けが発生します。おそらく、デフォルトで utf-8 に従ってデコードするようにデコードを設定していると思われます