带有 ;charset=UTF-8 的 MIME 类型的文件扩展名
File extension from MIME type with ;charset=UTF-8
我有一个 Python 网络爬虫,它正在下载具有不同扩展名的文件。要从 HTTP header 内容类型获取扩展,我使用 Python 库 mimetypes.
http_header = session.head(url, headers={'Accept-Encoding': 'identity'})
extension = mimetypes.guess_extension(http_header.headers['content-type'])
一切正常,除非 HTTP header 内容类型包含
;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
>>>
问题:如何处理此问题并从 content-types 以 ;charset=UTF-8
结尾获得正确的扩展名?
我想用 if 语句捕获此类异常不是一个好的解决方案,因为我不知道白名单是否完整或者我是否遗漏了一些 content-type.
一个简单的处理方法是拆分 MIME 字符串并仅获取第一个元素。
以下代码将 return 两个条件的预期结果。
http_header = session.head(url, headers={'Accept-Encoding': 'identity'})
extension = mimetypes.guess_extension(http_header.headers['content-type'].split(";")[0])))
记住这是一个猜测。对于诸如纯文本之类的广泛定义,您不能对它抱有太大期望。似乎 mimetypes.guess_extension() 只取了这个列表的第一个元素。这也是猜测 text/plain returns .h 的 mimetype 的原因,而 .txt 是显而易见的选择。
我有一个 Python 网络爬虫,它正在下载具有不同扩展名的文件。要从 HTTP header 内容类型获取扩展,我使用 Python 库 mimetypes.
http_header = session.head(url, headers={'Accept-Encoding': 'identity'})
extension = mimetypes.guess_extension(http_header.headers['content-type'])
一切正常,除非 HTTP header 内容类型包含
;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
>>>
问题:如何处理此问题并从 content-types 以 ;charset=UTF-8
结尾获得正确的扩展名?
我想用 if 语句捕获此类异常不是一个好的解决方案,因为我不知道白名单是否完整或者我是否遗漏了一些 content-type.
一个简单的处理方法是拆分 MIME 字符串并仅获取第一个元素。
以下代码将 return 两个条件的预期结果。
http_header = session.head(url, headers={'Accept-Encoding': 'identity'})
extension = mimetypes.guess_extension(http_header.headers['content-type'].split(";")[0])))
记住这是一个猜测。对于诸如纯文本之类的广泛定义,您不能对它抱有太大期望。似乎 mimetypes.guess_extension() 只取了这个列表的第一个元素。这也是猜测 text/plain returns .h 的 mimetype 的原因,而 .txt 是显而易见的选择。