从urlopen的胡言乱语

时间:2011-11-01 09:43:07

标签: python utf-8 urlopen

我正在尝试从下面代码中的地址读取一些utf-8文件。它适用于大多数,但对于某些文件,urllib2(和urllib)无法读取。

这里明显的答案是第二个文件已损坏,但奇怪的是IE浏览器都没有任何问题。该代码已经在XP和Linux上进行了测试,结果相同。任何sugestions?

import urllib2
#This works:
f=urllib2.urlopen("http://www.gutenberg.org/cache/epub/145/pg145.txt")
line=f.readline()
print "this works: %s)" %(line)
line=unicode(line,'utf-8') #... works fine

#This doesn't
f=urllib2.urlopen("http://www.gutenberg.org/cache/epub/144/pg144.txt")
line=f.readline()
print "this doesn't: %s)" %(line)
line=unicode(line,'utf-8')#...causes an exception:

3 个答案:

答案 0 :(得分:2)

>>> f=urllib2.urlopen("http://www.gutenberg.org/cache/epub/144/pg144.txt")
>>> f.headers.dict
{'content-length': '304513', ..., 'content-location': 'pg144.txt.utf8.gzip', 'content-encoding': 'gzip', ..., 'content-type': 'text/plain; charset=utf-8'}

设置一个标头,阻止网站发送gzip编码的响应,或首先对其进行解码。

答案 1 :(得分:0)

您要求的URL似乎是指私有缓存。请改为http://www.gutenberg.org/files/144/144-0.txt(在http://www.gutenberg.org/ebooks/144找到)。

如果您真的想使用/cache/网址:服务器正在向您发送gzip压缩数据,而不是unicode。 urllib2不会要求gzip压缩数据,也不会对其进行解码,这是正确的行为。 有关如何解压缩的信息,请参阅this question

答案 2 :(得分:-1)

你知道它不是一个解决方案,但你应该看http://pypi.python.org/pypi/requests库,无论你是否仍想使用urllib都可以查看Requests的源代码,了解它如何与utf-8字符串一起使用。< / p>