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
Vous devez vous connecter pour publier un commentaire.
Découvrez
urllib.urlretrieve
's code complet:En d'autres termes, vous pouvez utiliser urllib.FancyURLopener (c'est une partie du public urllib API). Vous pouvez remplacer
http_error_default
pour détecter une erreur 404:Vous devez utiliser:
Edit: La logique ici est que si vous vous attendez à l'état d'exception, c'est une exception pour que ça arrive, et vous n'avez probablement même pas y penser, donc au lieu de laisser votre code de continuer à fonctionner alors qu'il a échoué, le comportement par défaut est--assez sensiblement--pour inhiber son exécution.
L'URL de l'Ouvreur de l'objet "récupérer" méthode prend en charge la reporthook et déclenche une exception sur 404.
http://docs.python.org/library/urllib.html#url-opener-objects