【问题标题】:File extension from MIME type with ;charset=UTF-8MIME 类型的文件扩展名,带有 ;charset=UTF-8
【发布时间】:2017-03-17 16:06:11
【问题描述】:

我有一个 Python 网络爬虫,它正在下载具有不同扩展名的文件。为了从 HTTP 标头内容类型中获取扩展,我使用 Python 库 mimetypes

http_header = session.head(url, headers={'Accept-Encoding': 'identity'})
extension = mimetypes.guess_extension(http_header.headers['content-type'])

一切正常,除非 HTTP 标头内容类型包含
;charset=UTF-8。例如。 mimetypes.guess_extension 为以下示例返回 None

content-type: text/plain;charset=UTF-8 # extension should be .txt OR  
content-type: text/x-c;charset=UTF-8   # extension should be .java

检查 mimetypes:

>>> import mimetypes
>>> print(mimetypes.guess_extension('text/plain;charset=UTF-8'))
None
>>> 

问题:我该如何处理并从以 ;charset=UTF-8 结尾的内容类型中获取正确的扩展名?

我想用 if 语句捕获此类异常不是一个好的解决方案,因为我不知道白名单是否完整或我是否缺少某些内容类型。

【问题讨论】:

    标签: python http mime-types content-type


    【解决方案1】:

    一种简单的处理方法是拆分 MIME 字符串并仅获取第一个元素。

    以下代码将返回两种条件的预期结果。

    http_header = session.head(url, headers={'Accept-Encoding': 'identity'})
    extension = mimetypes.guess_extension(http_header.headers['content-type'].split(";")[0])))
    

    记住这是一个猜测。对于诸如纯文本之类的广泛定义,您不能期望太多。似乎 mimetypes.guess_extension() 只取了这个列表的第一个元素。这也是当 .txt 是显而易见的选择时,猜测 text/plain 的 mimetype 返回 .h 的原因。

    【讨论】:

    • 感谢您的回答,很遗憾这不起作用。对于text/plain;charset=UTF-8,我得到.ksh,而不是.txt。对于text/plain;charset=UTF-8,我得到.c 而不是.java
    • 这正是函数名所说的,这是一个猜测。对于诸如纯文本之类的广泛定义,您不能期望太多。似乎 mimetypes.guess_extension() 只取了这个列表的第一个元素。这也是当 .txt 是显而易见的选择时,猜测 text/plain 的 mimetype 返回 .h 的原因。
    • 您会认为 dict 查找比“猜测”更好。例如,图像/jpeg -> jpe。这太可怕了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 2015-06-06
    • 2010-10-03
    • 2010-12-09
    • 2011-05-14
    相关资源
    最近更新 更多