W Pythonie mogę używać urllib2 (i urllib) do otwierania zewnętrznych adresów URL, takich jak Google. Jednak pojawia się problem przy otwieraniu lokalnych adresów URL. Mam Pythona SimpleHTTPServer działa na porcie 8280, które można przeglądać, aby pomyślnie z wykorzystaniem http://localhost:8280/.Python urllib i urllib2 nie otwierające adresów localhost?
python -m SimpleHTTPServer 8280
Warto również zauważyć, że używam Ubuntu, która ma CNTLM systemem do obsługi uwierzytelniania do naszego pełnomocnika internetowej korporacyjnej. Dlatego wget tak naprawdę nie działa z localhostem, więc nie sądzę, że jest to problem z urllibem!
Script Test (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."
wyjściowa:
$ ./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
rozwiązanie: Problemem było rzeczywiście ponieważ używam CNTLM za naszym web proxy korporacyjnych (specyfika dlaczego to spowodowało problem, którego nie jestem pewien). Rozwiązaniem było użyć ProxyHandler:
proxy_support = urllib2.ProxyHandler({})
opener = urllib2.build_opener(proxy_support)
print opener.open("http://localhost:8380/").read(100)
Dzięki loki2302 za wskazanie mi here.
nie używaj 'except:' bez wyjątku i pokaż nam wyjątek podniesiony przez 'urllib2.urlopen'. – mouad
http://stackoverflow.com/questions/201515/urllib-urlopen-works-but-urllib2-urlopen-doesnt – agibalov
Wyjątek "BadStatusLine' sugeruje nieprawidłowy nagłówek odpowiedzi z serwera. Czy możesz rzucić okiem i zobaczyć, co jest zwracane? –