2009-08-20 15 views
25

Arka Plan 404 hatasını yakalamak için: urllib* modüllerde başka işlevi yerine ben (aşağıda reporthook bakınız) çünkü kanca işlevi desteği, urllib.urlretrieve kullanıyorum .. metinsel görüntülemek için kullanılan ilerleme çubuğu. Bu Python> = 2.6.nasıl urllib.urlretrieve içinde

>>> urllib.urlretrieve(url[, filename[, reporthook[, data]]]) 

Ancak urlretrieve HTTP isteğinin durumunu tespit etmek için bir yol bırakır, böylece dilsiz (örneğin: o 404 veya 200 idi?).

>>> 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 
'' 
>>> 

kanca benzeri destek ile uzak HTTP dosya indirmek için en iyi bilinen yolu nedir

ve iyi bir HTTP hata işleme (ilerleme çubuğu göstermek için)? urllib.urlretrieve 'ın tam kod

+0

İsteğiniz üzerine bir HTTP Durumu sağlamazsanız, muhtemelen stdlib'de bir hata olarak düşünülmelidir (ancak aşağıdaki daha iyi kütüphane, isteklere bakın) –

cevap

27

atın: Başka bir deyişle

def urlretrieve(url, filename=None, reporthook=None, data=None): 
    global _urlopener 
    if not _urlopener: 
    _urlopener = FancyURLopener() 
    return _urlopener.retrieve(url, filename, reporthook, data) 

, sen urllib.FancyURLopener (kamu urllib API o tarafını) kullanabilir. Sen 404'lerin algılamak için http_error_default geçersiz kılabilirsiniz:

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) 
+0

İşleyicileri belirtmek istemiyorum; urllib2.urlopen gibi istisnalar atıyor mu? –

+4

Atmak çok kolay. FancyURLopener alt sınıfları URLopener atar, böylece temel sınıfın uygulamasını çağırmayı deneyebilirsiniz: http_error_default (...): URLopener.http_error_default (...) – orip

+0

Bu çok iyi bir çözüm, bunu şimdi kendim kullandım. –

14

üzerinde bir istisna atar:

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) 

Düzeltme: İstisnai st Yedi, bunun gerçekleşmesi için bir istisnadır ve muhtemelen bunu düşünmüyordunuz - bu nedenle kodunuz başarısız olurken kodunuzu çalıştırmaya devam etmek yerine, varsayılan davranışı - oldukça mantıklı - yürütme.

+2

kanca benzeri destek? –

+1

Sridhar, bkz. Http://stackoverflow.com/a/9740603/819417 –