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

Python | Http - can't get the correct mime type

我正在使用 urllib3 构建网络爬虫。示例代码:

from urllib3 import PoolManager

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

我偶然发现了一些指向文档文件(如 docx 和 epub)的链接,我从服务器获得的 mime 类型是 text/plain。获得 对我来说很重要正确 mime 类型。

有问题的例子 url:

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

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

为什么 Firefox 没有被这些 url 弄糊涂,让用户立即下载文件?它怎么知道这个文件不是纯文本呢?我如何获得正确的 MIME 类型?

我没有读过 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",这可能是您想要的。

很遗憾,text/plain 是您回复的正确 MIME 类型,如 here 所述。

For text documents without specific subtype, text/plain should be used.

我在 Chrome 中测试了您的 URL 并且您描述的 Firefox 行为也发生了:Chrome 下载文件而不是打开它,即使使用 Content type header 正在 text/plain.

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

就是说,如果您想确定请求响应中出现的任何内容的真实 MIME 类型,则不能依赖 Content type header。也许另一种方法是暂时存储响应的文件并在之后确定其 MIME 类型。