Trong Python, tôi có thể sử dụng urllib2 (và urllib) để mở các URL bên ngoài như Google. Tuy nhiên, tôi đang gặp vấn đề khi mở URL localhost. Tôi có một SimplethonTPServer python chạy trên cổng 8280 mà tôi có thể duyệt đến thành công bằng cách sử dụng http://localhost:8280/.Python urllib và urllib2 không mở URL localhost?
python -m SimpleHTTPServer 8280
Điều đáng lưu ý là tôi đang chạy Ubuntu có CNTLM chạy để xử lý xác thực cho proxy web công ty của chúng tôi. Vì vậy, wget không thực sự làm việc với localhost, vì vậy tôi không nghĩ rằng đây là một vấn đề urllib!
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."
Output:
$ ./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: Vấn đề là thực sự vì tôi đang sử dụng CNTLM đằng sau proxy web của công ty chúng tôi (chi tiết cụ thể về việc tại sao điều này gây ra một vấn đề tôi không thể chắc chắn). Giải pháp là sử dụng ProxyHandler:
proxy_support = urllib2.ProxyHandler({})
opener = urllib2.build_opener(proxy_support)
print opener.open("http://localhost:8380/").read(100)
Nhờ loki2302 chỉ cho tôi here.
không sử dụng 'ngoại trừ:' không có Ngoại lệ và vui lòng hiển thị cho chúng tôi ngoại lệ do 'urllib2.urlopen' đưa ra. – mouad
http://stackoverflow.com/questions/201515/urllib-urlopen-works-but-urllib2-urlopen-doesnt – agibalov
Ngoại lệ 'BadStatusLine' cho thấy tiêu đề phản hồi không đúng định dạng từ máy chủ. Bạn có thể có một cái nhìn và xem những gì đang được trả lại? –