2009-12-22 13 views
16
import urllib 

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

El script anterior funciona y devuelve los resultados esperados, mientras que:urllib2.urlopen() vs urllib.urlopen() - urllib2 arroja 404 mientras que urllib funciona! ¿POR QUÉ?

import urllib2 

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

lanza el siguiente error:

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 

¿Alguien sabe qué es esto? Estoy ejecutando esto desde la computadora portátil en mi red doméstica sin configuración de proxy, solo directamente desde mi computadora portátil al enrutador y luego a la www.

Respuesta

35

Esa URL de hecho da como resultado un 404, pero con mucho contenido HTML. urllib2 lo está manejando (correctamente) como una condición de error. Puede recuperar el contenido de la página 404 de ese sitio como lo siguiente:

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

que es bueno saber, por curiosidad, cuando escribo esta URL en mi navegador, también funciona. ¿Esto significa que el navegador también está recibiendo un 404 pero solo muestra el contenido como lo hace urllib? –

+1

@Jerry Sí, eso es lo que esto significa. Puede verificar esto con Firebug o Safari/Chrome's Web Inspector. –

+0

Tengo Firebug y lo había comprobado, pero no vi nada que indicara un 404 - ¿hay algo especial que hacer? Por curiosidad morbosa, ¿por qué los navegadores toleran esos estándares tan pobres? ¿Por qué no simplemente indicar que no pudo encontrar el archivo? ¿Es este un truco del sitio que utiliza para frustrar los bots? ¿Devuelve un 404 con contenido sabiendo que el navegador mostrará el contenido y la mayoría de los bots seguirán adelante? –

Cuestiones relacionadas