2009-12-22 12 views
16
import urllib 

print urllib.urlopen('http://www.reefgeek.com/equipment/Controllers_&_Monitors/Neptune_Systems_AquaController/Apex_Controller_&_Accessories/').read() 

Le script ci-dessus fonctionne et renvoie les résultats attendus tout:urllib2.urlopen() vs urllib.urlopen() - urllib2 lance 404 alors que urllib fonctionne! POURQUOI?

import urllib2 

print urllib2.urlopen('http://www.reefgeek.com/equipment/Controllers_&_Monitors/Neptune_Systems_AquaController/Apex_Controller_&_Accessories/').read() 

jette l'erreur suivante:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.5/urllib2.py", line 124, in urlopen 
    return _opener.open(url, data) 
    File "/usr/lib/python2.5/urllib2.py", line 387, in open 
    response = meth(req, response) 
    File "/usr/lib/python2.5/urllib2.py", line 498, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "/usr/lib/python2.5/urllib2.py", line 425, in error 
    return self._call_chain(*args) 
    File "/usr/lib/python2.5/urllib2.py", line 360, in _call_chain 
    result = func(*args) 
    File "/usr/lib/python2.5/urllib2.py", line 506, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
urllib2.HTTPError: HTTP Error 404: Not Found 

Est-ce que quelqu'un sait pourquoi est-ce? Je cours ceci de l'ordinateur portable sur mon réseau domestique sans paramètres de proxy - juste directement de mon ordinateur portable au routeur puis au www.

Répondre

35

Cette URL génère en effet un 404, mais avec beaucoup de contenu HTML. urllib2 le gère (correctement) comme une condition d'erreur. Vous pouvez récupérer le contenu de la page 404 comme si de ce site:

import urllib2 
try: 
    print urllib2.urlopen('http://www.reefgeek.com/equipment/Controllers_&_Monitors/Neptune_Systems_AquaController/Apex_Controller_&_Accessories/').read() 
except urllib2.HTTPError, e: 
    print e.code 
    print e.msg 
    print e.headers 
    print e.fp.read() 
+2

qui est bon de savoir - par curiosité, quand je tape cette URL dans mon navigateur, cela fonctionne aussi. Est-ce que cela signifie que le navigateur reçoit également un 404 mais affiche simplement le contenu comme urllib? –

+1

@Jerry Oui, c'est ce que cela signifie. Vous pouvez le vérifier avec Firebug ou Safari/Chrome Web Inspector. –

+0

J'ai un firebug et je l'ai vérifié, mais je n'ai rien vu qui indique une 404 - y a-t-il quelque chose de spécial à faire? Par curiosité morbide, pourquoi les navigateurs tolèrent-ils de si mauvaises normes? Pourquoi ne pas simplement indiquer qu'il n'a pas pu trouver le fichier? Est-ce une sorte d'astuce sur le site qu'il utilise pour contrecarrer les bots - renvoyer un 404 avec du contenu sachant que le navigateur affichera le contenu et que la plupart des bots iront de l'avant? –