Форум сайта python.su
Всем доброго времени суток.
Столкнулся я со следующей проблемой - requests не может загрузить страницу, в url которой есть умлаут:
resp = requests.get('http://irr.ru/electronics-technics/ironing-sewing-equipment/sewing-machines/Prodam-shveynaya-mashinka-K%C3%B6hler-11-30-advert277603897.html') --------------------------------------------------------------------------- TooManyRedirects Traceback (most recent call last) <ipython-input-12-67230f7ebce4> in <module>() ----> 1 resp = requests.get('http://irr.ru/electronics-technics/ironing-sewing-equipment/sewing-machines/Prodam-shveynaya-mashinka-K%C3%B6hler-11-30-advert277603897.html') C:\Dev\Python32\lib\site-packages\requests\api.py in get(url, **kwargs) 53 54 kwargs.setdefault('allow_redirects', True) ---> 55 return request('get', url, **kwargs) 56 57 C:\Dev\Python32\lib\site-packages\requests\api.py in request(method, url, **kwargs) 42 43 session = sessions.Session() ---> 44 return session.request(method=method, url=url, **kwargs) 45 46 C:\Dev\Python32\lib\site-packages\requests\sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert) 333 'allow_redirects': allow_redirects, 334 } --> 335 resp = self.send(prep, **send_kwargs) 336 337 return resp C:\Dev\Python32\lib\site-packages\requests\sessions.py in send(self, request, **kwargs) 452 453 # Resolve redirects if allowed. --> 454 history = [resp for resp in gen] if allow_redirects else [] 455 456 # Shuffle things around if there's history. C:\Dev\Python32\lib\site-packages\requests\sessions.py in <listcomp>(.0) 452 453 # Resolve redirects if allowed. --> 454 history = [resp for resp in gen] if allow_redirects else [] 455 456 # Shuffle things around if there's history. C:\Dev\Python32\lib\site-packages\requests\sessions.py in resolve_redirects(self, resp, req, stream, timeout, verify, cert, proxies) 85 86 if i >= self.max_redirects: ---> 87 raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects) 88 89 # Release the connection back into the pool. TooManyRedirects: Exceeded 30 redirects.
Офлайн
В Python 2.7 работает нормально. В 3.3 такая же ошибка. И похоже она не в requests, а в стандартной библиотеке http/client.py parse_headers() или в ответе сервера (это RFC нужно глянуть).
В заголовке Location приходит строка в utf-8, а parse_headers() в 3.3 декодирует ее из iso-8859-1.
С urllib тоже не работает на 3.3:
try: from urllib import request as urllib except ImportError: import urllib url = 'http://irr.ru/electronics-technics/ironing-sewing-equipment/sewing-machines/Prodam-shveynaya-mashinka-K%C3%B6hler-11-30-advert277603897.html' r = urllib.urlopen(url)
Офлайн
>>> from grab import Grab >>> g = Grab() >>> g.go('http://irr.ru/electronics-technics/ironing-sewing-equipment/sewing-machines/Prodam-shveynaya-mashinka-K%C3%B6hler-11-30-advert277603897.html') <grab.response.Response object at 0xf970f8> >>> print g.doc.select('//title').text() Продам: швейная машинка Köhler 11-30, Москва - IRR.ru
Офлайн
Извиняюсь за долгое молчание.
Получается, это-таки баг, но не в requests, а в urllib?
lorien, спасибо за совет, но не хотелось бы прикручивать довольно большую библиотеку для простой загрузки страниц.
И мне очень интересно, почему Grab работает нормально, а requests - нет, хотя они обе вроде построены на одних и тех же стандартных библиотеках?
Офлайн
И мне очень интересно, почему Grab работает нормально, а requests - нет, хотя они обе вроде построены на одних и тех же стандартных библиотеках?Если очень интересно, смотрите исходный код библиотек и разбирайтесь, почему оно так, как есть.
Офлайн
lorien, уже заметил, спасибо.
Ладно, попробую заменить requests pycurl'ом.
Спасибо всем за помощь.
UPD
Скажите, а какие вообще есть альтернативы requests?
Хотел вот переписать свой код под pycurl, но его нет под Py3. Да и интерфейс его, мягко говоря, оставляет желать лучшего (для моих целей).
Хотелось бы что-нибудь, что как request позволяет сделать get(url) и получить потом код HTTP и текст ответа.
Есть что-нибудь такое?
Отредактировано shau-kote (Авг. 17, 2013 22:15:19)
Офлайн
аа там вродьбы httpie еще был - подобие curl
Офлайн
Скажите, а какие вообще есть альтернативы requests?
Хотел вот переписать свой код под pycurl, но его нет под Py3. Да и интерфейс его, мягко говоря, оставляет желать лучшего (для моих целей).
Хотелось бы что-нибудь, что как request позволяет сделать get(url) и получить потом код HTTP и текст ответа.
Есть что-нибудь такое?
Офлайн
lorien, я на него смотрел, приятный фреймворк, но в документации чётко сказано “Grab is developed for python 2.x environment. It does not support py3k yet.”
Офлайн
Документация устарела. Сейчас Grab работает под python 3, все тесты выполняются.
Офлайн