2016-11-14 12 views
3

urllib3を使用してWebクローラーを構築しています。コード例:Python | Http - 正しいMIMEタイプを取得できません

from urllib3 import PoolManager 

pool = PoolManager() 
response = pool.request("GET", url) 
mime_type = response.getheader("content-type") 

私は、このようなdocxファイルやEPUBなどのファイルを文書化するためにいくつかのリンクにつまずいていると私は、サーバーから取得していますMIMEタイプはtext/plain .ITは正しい MIMEを得るために私に重要ですタイプ。問題のあるURLへ

例:今

http://lsa.mcgill.ca/pubdocs/files/advancedcommonlawobligations/523-gold_advancedcommonlawobligations_-2013.docx

ファイルのMIMEタイプを取得するロジックは、それをサーバーから取得し、ファイルの拡張子を取得しようとして利用できない場合はされています。

どうすればFirefoxがこのような種類のURLで混乱することはなく、ユーザーはすぐにファイルをダウンロードできますか?このファイルがプレーンテキストではないことをどのように知っていますか?正しいMIMEタイプを取得するにはどうすればよいですか?

+0

あなたは 'response'でどのようにMIMEタイプにアクセスしていますか? – lucasnadalutti

+0

質問を更新しました。 –

+0

これは、この問題を回避する方法です。まず、レスポンスを一時ファイルに保存します。そして、保存されたファイル名の 'content-type'を取り出します。 [リンク](http://stackoverflow.com/questions/43580/how-to-find-the-mime-type-of-a-file-in-python) –

答えて

1

私はFirefoxのソースコードを読んでいませんが、FirefoxはURLに基​​づいてファイルタイプを推測するか、特定のContent-Typeで最大サイズより大きい場合はインラインでレンダリングを拒否しますまた、ファイル内容の一部を調べて、開始時にmagic numberに基づいてファイルの内容を調べることさえできます。

あなたはファイルタイプは、URLに基​​づいているものを推測するために、標準ライブラリ内のPython mimetypes moduleを使用することができます。この場合

import mimetypes 
url = "http://lsa.mcgill.ca/pubdocs/files/advancedcommonlawobligations/523-gold_advancedcommonlawobligations_-2013.docx" 
type, encoding = mimetypes.guess_type(url) 

を、typeはあなたが望むものはおそらくある"application/vnd.openxmlformats-officedocument.wordprocessingml.document"です。

1

hereのように、残念ながらtext/plainがあなたの応答の正しいMIMEタイプです。

特定のサブタイプのないテキストドキュメントの場合は、text/plainを使用してください。

私はChromeであなたのURLをテストし、あなたがFirefox用の説明動作も起こっ:ChromeがさえContent typeヘッダがtext/plainことで、代わりにそれを開くと、ファイルをダウンロードしました。

enter image description here

これは、これらのブラウザは、彼らがそのファイルを解析するために、独自の制限を含むかもしれないと述べたファイルを、ダウンロードするか、開く必要があるかどうかを判断するだけで、このヘッダー以上のものを使用することを意味します。

つまり、要求の応答に含まれる実際のMIMEタイプを判別する場合は、Content typeヘッダーに頼ることはできません。代わりに、一時的にレスポンスのファイルを保存し、その後MIMEタイプを決定することもできます。

関連する問題