Comment attraper erreur 404 dans urllib.urlretrieve

Contexte: je suis en utilisant urllib.urlretrieve, contrairement à toute autre fonction dans le urllib* modules, en raison de la fonction de raccordement de soutien (voir reporthook ci-dessous) .. qui est utilisé pour afficher le texte de la barre de progression. C'est Python >=2.6.

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

Cependant, urlretrieve est tellement stupide qu'il ne laisse aucun moyen de détecter l'état de la requête HTTP (par exemple: c'était une 404 ou 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
''
>>>

Quel est le meilleur moyen connu pour télécharger une distance de fichier HTTP avec crochet de support de type (pour montrer la barre de progression) et un décent HTTP erreur de manipulation?

  • Ne fournissant pas une HTTP Statut sur votre demande doit probablement être considéré comme un bug dans la stdlib (mais de vérifier la beaucoup mieux de la bibliothèque, les demandes ci-dessous)
  • c'est tellement stupide que urlretrieve ne peut pas gérer cela avec un retour d'état