Бред из урлопена - PullRequest
       64

Бред из урлопена

2 голосов
/ 01 ноября 2011

Я пытаюсь прочитать некоторые файлы 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 ]

2 голосов
/ 01 ноября 2011
>>> 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-кодированный ответ, либо сначала декодируйте его.

0 голосов
/ 01 ноября 2011

Вы знаете, что это не решение, но вы должны посмотреть библиотеку http://pypi.python.org/pypi/requests, независимо от того, хотите ли вы использовать urllib, можете посмотреть исходный код Requests, чтобы понять, как он работает со строками utf-8.

0 голосов
/ 01 ноября 2011

Похоже, что запрашиваемый вами URL ссылается на частный кеш. Вместо этого попробуйте http://www.gutenberg.org/files/144/144-0.txt (можно найти по адресу http://www.gutenberg.org/ebooks/144).

Если вы действительно хотите использовать URL-адрес /cache/: сервер отправляет вам сжатые данные, а не юникод. urllib2 не запрашивает сжатые данные и не декодирует их, что является правильным поведением. См. этот вопрос о том, как его распаковать.

...