Как поймать ошибку 404 в urllib.urlretrieve
Фон: я использую urllib.urlretrieve
, в отличие от любой другой функции в модулях urllib*
, из-за поддержки функции hook (см. ниже reporthook
).., который используется для отображения текстового индикатора выполнения. Это Python >= 2.6.
>>> urllib.urlretrieve(url[, filename[, reporthook[, data]]])
Однако urlretrieve
настолько тупой, что не оставляет возможности обнаружить статус HTTP-запроса (например: было ли оно 404 или 200?).
>>> fn, h = urllib.urlretrieve('http://google.com/foo/bar')
>>> h.items()
[('date', 'Thu, 20 Aug 2009 20:07:40 GMT'),
('expires', '-1'),
('content-type', 'text/html; charset=ISO-8859-1'),
('server', 'gws'),
('cache-control', 'private, max-age=0')]
>>> h.status
''
>>>
Каков наилучший способ загрузить удаленный HTTP файл с поддержкой крючка (чтобы показать индикатор выполнения) и достойную обработку ошибок HTTP?
Ответы
Ответ 1
Проверьте urllib.urlretrieve
полный код:
def urlretrieve(url, filename=None, reporthook=None, data=None):
global _urlopener
if not _urlopener:
_urlopener = FancyURLopener()
return _urlopener.retrieve(url, filename, reporthook, data)
Другими словами, вы можете использовать urllib.FancyURLopener (это часть общедоступного API urllib). Вы можете переопределить http_error_default
для обнаружения 404s:
class MyURLopener(urllib.FancyURLopener):
def http_error_default(self, url, fp, errcode, errmsg, headers):
# handle errors the way you'd like to
fn, h = MyURLopener().retrieve(url, reporthook=my_report_hook)
Ответ 2
Вы должны использовать:
import urllib2
try:
resp = urllib2.urlopen("http://www.google.com/this-gives-a-404/")
except urllib2.URLError, e:
if not hasattr(e, "code"):
raise
resp = e
print "Gave", resp.code, resp.msg
print "=" * 80
print resp.read(80)
Edit: Обоснование здесь состоит в том, что, если вы не ожидаете исключительного состояния, это исключение для него, и вы, вероятно, даже не думали об этом, поэтому вместо того, чтобы позволить вашему коду продолжать работать, пока он был неудачно, поведение по умолчанию - вполне разумно - препятствует его выполнению.
Ответ 3
Метод "Retreive" объекта "Открывающий" URL-адрес поддерживает запись в журнале и выдает исключение на 404.
http://docs.python.org/library/urllib.html#url-opener-objects