在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。
中詢問的另一個網址不要使用'except:'沒有異常,並請向我們展示'urllib2.urlopen'引發的異常。 – mouad
http://stackoverflow.com/questions/201515/urllib-urlopen-works-but-urllib2-urlopen-doesnt – agibalov
'BadStatusLine'異常表明服務器的格式錯誤的響應頭。你能看一看,看看有什麼被退回? –