1

我正在尝试从 url 访问图像:

http://www.lifeasastrawberry.com/wp-content/uploads/2013/04/IMG_1191-1024x682.jpg

但是,它在最后一步失败并显示 IOError("cannot identify image file")。不知道发生了什么或如何解决它。它已与许多其他 url 图像一起使用。

    opener = urllib2.build_opener()
    opener.addheaders = [('User-agent', 'Mozilla/5.0')]
    opener.addheaders = [('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')]
    opener.addheaders = [('Accept-Encoding', 'gzip,deflate,sdch')]

    response = opener.open(image_url,None,5)
    img_file = cStringIO.StringIO(response.read())  

    image = Image.open(img_file)

这个网址也失败了:

http://www.canadianliving.com/img/photos/biz/Greek-Yogurt-Ceaser-Salad-Dressi1365783448.jpg

4

1 回答 1

1

问题是您告诉您的 URL 检索器从服务器请求 gzip 编码的结果,因此您收到的图像数据是 gzip 编码的。您可以通过删除accept-encoding请求中的标头或手动解压缩 gzip 编码的结果来解决此问题:

from PIL import Image
import urllib2
import gzip
import cStringIO

opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
opener.addheaders = [('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')]
opener.addheaders = [('Accept-Encoding', 'gzip,deflate,sdch')]

gzipped_file = cStringIO.StringIO(opener.open(url, None, 5).read())
image = Image.open(gzip.GzipFile(fileobj=gzipped_file))

这种方法的问题在于,如果您在 HTTP 请求中接受多个编码,那么您需要查看结果的 HTTP 标头以查看您实际获得的编码,然后根据该值指示的内容手动解码。

我认为将accept-encoding 标头设置为一个值更容易,这样您将只接受一种编码(例如,'identity;q=1, *;q=0'或类似的东西),或者继续使用requests 包来执行HTTP。

于 2013-09-01T18:02:35.140 回答