2009-12-22 5 views
16
import urllib 

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

Lo script precedente funziona e restituisce i risultati attesi, mentre:urllib2.urlopen() vs urllib.urlopen() - urllib2 genera 404 mentre urllib funziona! PERCHÉ?

import urllib2 

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

tiri il seguente errore:

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 

Qualcuno sa perché questo è? Sto eseguendo questo dal portatile sulla mia rete domestica senza impostazioni proxy - direttamente dal mio portatile al router, poi al www.

risposta

35

Quell'URL risulta in effetti un 404, ma con un sacco di contenuto HTML. urllib2 lo gestisce (correttamente) come una condizione di errore. Puoi recuperare il contenuto della pagina 404 di quel sito in questo modo:

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

questo è bello sapere - per curiosità, quando digito questo URL nel mio browser, funziona anche. Questo significa che il browser sta anche ricevendo un 404 ma sta semplicemente visualizzando il contenuto come fa urllib? –

+1

@Jerry Sì, questo è ciò che significa. Puoi verificarlo con Firebug o Safari/Chrome's Web Inspector. –

+0

Ho firebug e l'ho controllato, ma non ho visto nulla che indicasse un 404 - c'è qualcosa di speciale che devi fare? Per curiosità morbosa, perché i browser tollerano standard così bassi? Perché non indicare solo che non è stato possibile trovare il file? È questo un qualche tipo di trucco il sito che usa per bloccare i bot - restituire un 404 con contenuto sapendo che il browser mostrerà il contenuto e la maggior parte dei bot si muoverà? –