【问题标题】:Python | Http - can't get the correct mime type蟒蛇 | Http - 无法获得正确的 mime 类型
【发布时间】:2017-03-28 11:55:41
【问题描述】:

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

from urllib3 import PoolManager

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

我偶然发现了几个文档文件的链接,例如 docx 和 epub,我从服务器获取的 mime 类型是 text/plain。获得 正确 mime 对我来说很重要输入。

有问题的网址示例:

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

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

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

【问题讨论】:

  • 您如何访问response 中的mime 类型?
  • 我已经更新了问题。
  • 这可能是解决这个问题的方法。首先将响应保存到临时文件中。然后为保存的文件名获取content-typelink
  • 这对我有帮助 mime.ritey.com

标签: python mime-types urllib3


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-05-26
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 2020-01-20
      相关资源
      最近更新 更多