2011-08-10 92 views
7

在Python中,我可以使用urllib2(和urllib)打開外部URL,例如Google。不過,我在打開本地主機URL時遇到了問題。我有一個在端口8280上運行的python SimpleHTTPServer,我可以使用http://localhost:8280/成功瀏覽。Python urllib和urllib2不能打開本地主機的URL?

python -m SimpleHTTPServer 8280 

另外值得一提的是,我運行Ubuntu具有CNTLM運行來處理身份驗證我們的企業Web代理。因此,wget實際上並不與localhost一起工作,所以我不認爲這是urllib問題!

測試腳本(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." 

輸出:

$ ./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 

SOLUTION:問題確實是因爲我使用CNTLM背後我們的企業Web代理(的具體原因這導致了一個問題,我不能確定)。解決的辦法是使用ProxyHandler:

proxy_support = urllib2.ProxyHandler({}) 
opener = urllib2.build_opener(proxy_support) 
print opener.open("http://localhost:8380/").read(100) 

感謝loki2302指着我here

+2

中詢問的另一個網址不要使用'except:'沒有異常,並請向我們展示'urllib2.urlopen'引發的異常。 – mouad

+5

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

+0

'BadStatusLine'異常表明服務器的格式錯誤的響應頭。你能看一看,看看有什麼被退回? –

回答

2

檢查是否真的在打開本地主機,或JBoss應用是否能給予無效響應(瀏覽器以某種方式工作解決):

  1. 使用http://127.0.0.1:8280/,而不是嘗試「localhost:8280」(如果可以的話,這是一個DNS問題)
  2. 使用curl或wget來測試JBoss的工作原理:wget http://localhost:8280/
  3. 你可以嘗試運行一個簡單的Python HTTP服務器來測試比對JBoss的其他東西:

    python -m SimpleHTTPServer 8280 
    
+0

好主意。 Wget不起作用!我使用運行CNTLM的Ubuntu來處理對我們公司Web代理的身份驗證,因此這必定是問題的根源。我相應地更新了我的問題。有任何想法嗎? – ryan

+0

聽起來像你有代理設置,也被用於localhost/127.0.0.1。根據它的設置(我不瞭解CNTLM),可能會爲localhost設置一個例外。 –

+0

此外,loki2302在問題評論中的鏈接可能很有用,它包含一個關於如何忽略代理設置的方法,因此(除非您有透明代理或以其他方式強制執行),它可以幫助您。 –

2

嘗試使用的urllib:問題

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

我也是在我的網絡服務器有這個問題。但問題的根源在於我的web服務器是單線程的,只能回答一個請求。因此,在一個請求的過程中,它無法回答我在urllib2