Бред из урлопена
Я пытаюсь прочитать некоторые файлы utf-8 с адресов в приведенном ниже коде. Это работает для большинства из них, но для некоторых файлов urllib2 (и urllib) не может прочитать.
Очевидный ответ здесь заключается в том, что второй файл поврежден, но странно то, что IE читает их оба без проблем. Код был протестирован как на XP, так и на Linux, с одинаковыми результатами. Любые предложения?
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 ответа
>>> 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-кодированный ответ, либо сначала декодируйте его.
Похоже, что запрашиваемый вами URL ссылается на частный кеш. Попробуйте вместо этого http://www.gutenberg.org/files/144/144-0.txt (см. http://www.gutenberg.org/ebooks/144).
Если вы действительно хотите использовать /cache/
URL: сервер отправляет вам сжатые данные, а не юникод. urllib2
не запрашивает сжатые данные и не декодирует их, что является правильным поведением. Смотрите этот вопрос о том, как распаковать его.
Вы знаете, что это не решение, но вы должны посмотреть библиотеку http://pypi.python.org/pypi/requests, независимо от того, хотите ли вы использовать urllib, можете посмотреть исходный код запроса, чтобы понять, как он работает с utf-8 строк.