2016-11-14 29 views
3

我正在使用urllib3構建網絡爬蟲。示例代碼: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。它是對我很重要,以獲得正確的啞劇類型。

例到有問題的網址:

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

現在越來越文件的MIME類型是從服務器獲取它,如果沒有可用的試圖獲得該文件的擴展名的邏輯。

爲什麼Firefox不會被這些類型的網址混淆,讓用戶立即下載文件?它如何知道這個文件不是純文本?我怎樣才能得到正確的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找出它的含義。

您可以使用Python mimetypes module標準庫猜測文件類型是基於URL:

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

不幸的是,text/plain是正確的MIME類型的響應,如here所述。

對於沒有特定子類型的文本文檔,應該使用text/plain。

我測試您的網址在Chrome和您的Firefox中描述的行爲發生,以及:Chrome瀏覽器下載的文件,而不是打開它,甚至與Content type頭是text/plain

enter image description here

這意味着那些瀏覽器使用的不僅僅是這個頭更以確定它們是否應該下載或打開所述文件,其中可能包括其自身的侷限性來解析該文件。

也就是說,如果您想確定請求響應中出現的MIME類型,那麼您無法依賴Content type標頭。也許另一種方法是臨時存儲響應的文件並在之後確定其MIME類型。