Python urllib和urllib2没有打开localhost URL?

时间:2011-08-10 14:12:37

标签: python urllib2 urllib

在Python中,我可以使用urllib2(和urllib)打开外部URL,例如Google。但是,我在打开localhost URL时遇到了问题。我在端口8280上运行了一个python SimpleHTTPServer,我可以使用http://localhost:8280/成功浏览。

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

解决方案:问题确实是因为我在公司网络代理服务器后面使用了CNTLM(为什么会导致我无法确定的问题)。解决方案是使用ProxyHandler:

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

感谢loki2302指点我here

3 个答案:

答案 0 :(得分:3)

检查问题是否真的在打开localhost,或者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
    

答案 1 :(得分:2)

尝试使用urllib:

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

答案 2 :(得分:1)

我的网络服务器也遇到了这个问题。但问题的根源是我的网络服务器是单线程,只能回答一个请求。因此,在一个请求的过程中,它无法回答我在urllib2中提出的另一个网址