2011-08-10 14 views
7

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.

+2

nie używaj 'except:' bez wyjątku i pokaż nam wyjątek podniesiony przez 'urllib2.urlopen'. – mouad

+5

http://stackoverflow.com/questions/201515/urllib-urlopen-works-but-urllib2-urlopen-doesnt – agibalov

+0

Wyjątek "BadStatusLine' sugeruje nieprawidłowy nagłówek odpowiedzi z serwera. Czy możesz rzucić okiem i zobaczyć, co jest zwracane? –

Odpowiedz

2

Sprawdź, czy problem jest naprawdę w otwarciu localhost, czy JBoss daje niepoprawną odpowiedź (to przeglądarka jakoś działa ok):

  1. spróbuj http://127.0.0.1:8280/ zamiast "localhost: 8280" (jeśli to działa, jest to problem DNS)
  2. użyj curl lub wget do przetestowania JBoss: wget http://localhost:8280/
  3. można spróbować uruchomić prosty serwer HTTP Python przetestować przeciwko coś innego niż JBoss:

    python -m SimpleHTTPServer 8280 
    
+0

Doskonały pomysł. Wget nie działa! Używam Ubuntu z uruchomionym CNTLM do obsługi uwierzytelniania w naszym korporacyjnym proxy sieciowym, więc to musi być źródłem problemu. Odpowiednio zaktualizowałem moje pytanie. Jakieś pomysły? – ryan

+0

Wygląda na to, że masz zestaw proxy, który również zostanie użyty dla localhost/127.0.0.1. W zależności od tego, jak jest ustawiony (nie wiem o CNTLM), może być możliwe zrobienie wyjątku dla localhost. –

+0

Również link loki2302 w komentarzach do pytania może być przydatny, zawiera przepis na ignorowanie ustawień proxy, więc (chyba że masz przezroczysty serwer proxy lub jest wymuszony w inny sposób) może ci pomóc. –

2

spróbować użyć urllib:

import urllib 
localhost = urllib.urlopen("http://localhost:8280/") 
print localhost.read(100) 
1

miałem również ten problem w moim serwerze internetowym. Ale źródłem problemu był fakt, że mój serwer WWW był pojedynczy wątek i może odpowiedzieć tylko na jedno żądanie. Tak więc podczas procesu jednego żądania nie może odpowiedzieć na inny adres URL, o który pytałem w urllib2

Powiązane problemy