python urllib脚本中的简单错误

python urllib脚本中的简单错误,python,centos,urllib2,Python,Centos,Urllib2,我从另一个SO问题复制了这段代码,但我无法解决我遇到的错误 这是我的密码 import os import urllib2 import sys d = urllib2.urlopen("http://www.google.com.au/logos/2012/new_years_eve_2012_-_english_only-1049005-hp.jpg") o = open('image.%s' % d.info().gettype(), 'w') o.write(d.read()) 错误是

我从另一个SO问题复制了这段代码,但我无法解决我遇到的错误

这是我的密码

import os
import urllib2
import sys
d = urllib2.urlopen("http://www.google.com.au/logos/2012/new_years_eve_2012_-_english_only-1049005-hp.jpg")
o = open('image.%s' % d.info().gettype(), 'w')
o.write(d.read())
错误是

回溯(最后一次调用):文件“/image\u test.py”,第6行, 在里面 o=open('image.%s'%d.info().gettype(),'w')IOError:[Errno 2]没有这样的文件或目录:“image.image/jpeg”


它告诉你错误。。。。没有这样的文件或目录:“image.image/jpeg”。。。显然,gettype返回类似于“image/jpg”的内容。。。。您可以拆分它以获得扩展(可能不总是有效…)


这是因为HTML MIME类型通常包括斜杠,例如
image/jpeg
。由于斜杠是文件系统路由中使用的一种特殊字符,因此这会导致
open
的混淆

您只需避免在文件名中使用斜杠,例如Joran建议的方式

更新为了使其在所有情况下都能工作,您必须获得映射MIME类型->文件扩展名。Apache上有一个:。将其解析为python字典后,如下所示:

import re

mimetypes = {}
with open('mime.types') as mimedata:
    for line in [line.strip() for line in mimedata.readlines()]:
        if line[0] == '#':
            continue

        # This pattern will only get the first extension in the list
        pattern = re.compile(r'([^\s]+)\s+([^\s]+)')
        result  = pattern.match(line)
        mime    = result.group(1)
        ext     = result.group(2)
        mimetypes[mime] = ext
您将按以下方式使用它:

mime = d.info().gettype()
ext = ''
if mime in mimetypes:
    ext = mimetypes[mime]

o = open('data' + ext, 'w')
o.write(d.read())

你说,它可能并不总是有效的。是否有任何方法总是有效?我如何将其解析为
mimetypes
。我不明白
mime = d.info().gettype()
ext = ''
if mime in mimetypes:
    ext = mimetypes[mime]

o = open('data' + ext, 'w')
o.write(d.read())