En Python puedo usar urllib2 (y urllib) para abrir URL externas como Google. Sin embargo, estoy teniendo problemas al abrir URL de localhost. Tengo un Python SimpleHTTPServer ejecutándose en el puerto 8280, que puedo buscar con éxito usando http://localhost:8280/.Python urllib y urllib2 no abren URL de localhost?
python -m SimpleHTTPServer 8280
Es también digno de mención que estoy con Ubuntu que tiene CNTLM corriendo para manejar la autenticación a nuestro proxy web corporativa. Por lo tanto, wget en realidad no funciona con localhost, ¡así que no creo que esto sea un problema de urllib!
script de prueba (test_urllib2.py):
import urllib2
print "Opening Google..."
google = urllib2.urlopen("http://www.google.com/")
print google.read(100)
print "Google opened."
print "Opening localhost..."
localhost = urllib2.urlopen("http://localhost:8280/")
print localhost.read(100)
print "localhost opened."
Salida:
$ ./test_urllib2.py
Opening Google...
<!doctype html><html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><
Google opened.
Opening localhost...
Traceback (most recent call last):
File "./test_urllib2.py", line 10, in <module>
localhost = urllib2.urlopen("http://localhost:8280/")
File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.6/urllib2.py", line 397, in open
response = meth(req, response)
File "/usr/lib/python2.6/urllib2.py", line 510, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.6/urllib2.py", line 429, in error
result = self._call_chain(*args)
File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain
result = func(*args)
File "/usr/lib/python2.6/urllib2.py", line 605, in http_error_302
return self.parent.open(new, timeout=req.timeout)
File "/usr/lib/python2.6/urllib2.py", line 391, in open
response = self._open(req, data)
File "/usr/lib/python2.6/urllib2.py", line 409, in _open
'_open', req)
File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain
result = func(*args)
File "/usr/lib/python2.6/urllib2.py", line 1161, in http_open
return self.do_open(httplib.HTTPConnection, req)
File "/usr/lib/python2.6/urllib2.py", line 1134, in do_open
r = h.getresponse()
File "/usr/lib/python2.6/httplib.py", line 986, in getresponse
response.begin()
File "/usr/lib/python2.6/httplib.py", line 391, in begin
version, status, reason = self._read_status()
File "/usr/lib/python2.6/httplib.py", line 355, in _read_status
raise BadStatusLine(line)
httplib.BadStatusLine
Solución: el problema era de hecho porque estoy utilizando CNTLM detrás de nuestro proxy web corporativa (detalles de por qué esto causó un problema, no estoy seguro). La solución fue usar el ProxyHandler:
proxy_support = urllib2.ProxyHandler({})
opener = urllib2.build_opener(proxy_support)
print opener.open("http://localhost:8380/").read(100)
Gracias a loki2302 por señalarme here.
no use 'excepto:' sin excepción y por favor, nos muestran la excepción planteada por 'urllib2.urlopen'. – mouad
http://stackoverflow.com/questions/201515/urllib-urlopen-works-but-urllib2-urlopen-doesnt – agibalov
La excepción 'BadStatusLine' sugiere un encabezado de respuesta mal formado del servidor. ¿Podrías echar un vistazo y ver qué se devuelve? –