2016-11-14 69 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类型。