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