Python | Http - 无法获得正确的mime类型

时间:2016-11-14 18:43:28

标签: python mime-types urllib3

我正在使用urllib3构建网络抓取工具。示例代码:

from urllib3 import PoolManager

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

我偶然发现了一些指向文档文件的链接,例如docx和epub,以及我从服务器获取的mime类型text/plain。对我来说,获取正确<非常重要/ strong> mime type。

有问题的网址示例:

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

现在,获取文件的mime类型的逻辑是从服务器获取它,如果不可用则尝试获取文件的扩展名。

为什么Firefox不会被这些网址弄糊涂,让用户立即下载文件?怎么知道这个文件不是纯文本?我怎样才能获得正确的mime类型?

2 个答案:

答案 0 :(得分: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 :(得分:1)

不幸的是,"Error: Invalid CSS after \"...tstrap for Sass\": expected selector or at-rule, was \"@import \"bootst...\"\A on line 15 of bs-compass-simple/sass/styles.scss\A \A 10: // Bootswatch theme variables\A 11: @import \"themes/cerulean-variables\"\A 12: \A 13: \A 14: // Import Bootstrap for Sass\A 15: @import \"bootstrap\";\A 16: \A 17: // Bootswatch themes\A 18: @import \"themes/cerulean-bootswatch\" 是您的回复的正确MIME类型,如here所述。

  

对于没有特定子类型的文本文档,应使用text / plain。

我在Chrome中测试了您的网址,您在Firefox中描述的行为也是如此:即使text/plain标题为Content type,Chrome也会下载该文件而不是打开它。

enter image description here

这意味着这些浏览器不仅使用此标头来确定是否应下载或打开所述文件,这可能包括解析该文件的限制。

也就是说,如果您想确定请求响应中的任何内容的真实MIME类型,您就无法依赖text/plain标头。也许另一种方法是临时存储响应文件并在之后确定其MIME类型。