2009-08-17 123 views
1

我安装了Python 2.6.2更早的Windows XP计算机上并运行下面的代码:Python urllib2 URLError异常?

import urllib2 
import urllib 

page = urllib2.Request('http://www.python.org/fish.html') 
urllib2.urlopen(page) 

我碰到下面的错误。

Traceback (most recent call last):<br> 
    File "C:\Python26\test3.py", line 6, in <module><br> 
    urllib2.urlopen(page)<br> 
    File "C:\Python26\lib\urllib2.py", line 124, in urlopen<br> 
    return _opener.open(url, data, timeout)<br> 
    File "C:\Python26\lib\urllib2.py", line 383, in open<br> 
    response = self._open(req, data)<br> 
    File "C:\Python26\lib\urllib2.py", line 401, in _open<br> 
    '_open', req)<br> 
    File "C:\Python26\lib\urllib2.py", line 361, in _call_chain<br> 
    result = func(*args)<br> 
    File "C:\Python26\lib\urllib2.py", line 1130, in http_open<br> 
    return self.do_open(httplib.HTTPConnection, req)<br> 
    File "C:\Python26\lib\urllib2.py", line 1105, in do_open<br> 
    raise URLError(err)<br> 
URLError: <urlopen error [Errno 11001] getaddrinfo failed><br><br><br> 
+0

当你尝试存在一个URL时会发生什么?您发布的错误闻起来像是代理/防火墙问题。我不会提交答案,因为我真的没有资格去调试这些东西,但我希望这个评论能够指出有网络知识的人在一个更富有成效的方向上比“你的代码是错误的”和“你的URL没有存在”。 – 2009-08-17 20:56:20

回答

4
import urllib2 
response = urllib2.urlopen('http://www.python.org/fish.html') 
html = response.read() 

你就错了。

+0

现在,我得到这个错误:

回溯(最近通话最后一个):
... '_open',REQ)
文件 “C:\ Python26 \ LIB \ urllib2.py”,线路361,在_call_chain
结果= FUNC(*参数)
文件 “C:\ Python26 \ lib中\ urllib2.py”,线1130,在http_open
返回self.do_open(httplib.HTTPConnection,REQ)
文件“C :\ Python26 \ lib \ urllib2.py“,行1105,在do_open中
raise URLError(err)
URLError:


感谢您的帮助。 – 2009-08-17 20:18:03

+2

这可能是因为您提供的网址不存在(请尝试访问它)。使用别的东西。 – mcandre 2009-08-17 20:26:36

+2

Downvoted,因为它没有解决真正的问题。我在WinXP上使用2.6.1(完全相同的urllib2.py,我检查),当我执行DJDonaL3000的代码时,我得到预期的urllib2.HTTPError:HTTP错误404:未找到。 – 2009-08-17 20:31:50

1

Windows Vista,python 2.6.2

这是一个404页面,对吗?

>>> import urllib2 
>>> import urllib 
>>> 
>>> page = urllib2.Request('http://www.python.org/fish.html') 
>>> urllib2.urlopen(page) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python26\lib\urllib2.py", line 124, in urlopen 
    return _opener.open(url, data, timeout) 
    File "C:\Python26\lib\urllib2.py", line 389, in open 
    response = meth(req, response) 
    File "C:\Python26\lib\urllib2.py", line 502, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "C:\Python26\lib\urllib2.py", line 427, in error 
    return self._call_chain(*args) 
    File "C:\Python26\lib\urllib2.py", line 361, in _call_chain 
    result = func(*args) 
    File "C:\Python26\lib\urllib2.py", line 510, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
urllib2.HTTPError: HTTP Error 404: Not Found 
>>> 
0

DJ

首先,我看不出有任何理由要导入的urllib;我只见过用urllib2完全替换urllib,并且我知道没有任何功能可以从urllib中使用,但从urllib2中却没有。

接下来,我注意到http://www.python.org/fish.html给我一个404错误。 (这并不能解释你所看到的回溯/异常。我得到urllib2.HTTPError: HTTP Error 404: Not Found

通常,如果你只想对网页进行默认提取(不添加特殊的HTTP头,做任何形式的POST,等等),那么以下就足够了:

req = urllib2.urlopen('http://www.python.org/') 
html = req.read() 
# and req.close() if you want to be pedantic 
3

已经在urllib2的来源看,在由回溯指定的行:

File "C:\Python26\lib\urllib2.py", line 1105, in do_open 
raise URLError(err) 

在那里你会看到下面的代码片段:

try: 
     h.request(req.get_method(), req.get_selector(), req.data, headers) 
     r = h.getresponse() 
    except socket.error, err: # XXX what error? 
     raise URLError(err) 

因此,它看起来像来源是一个套接字错误,而不是HTTP协议相关的错误。可能的原因:你不在线,你是在一个限制性的防火墙后面,你的DNS是关闭的,...

除了这个事实,所有这一切,mcandre指出,你的代码是错误的。

2

名称解析错误。

getaddrinfo用于解析请求中的主机名(python.org)。如果失败,则意味着该名称不能被解决,因为:

  1. 它不存在,或者记录是过时的(可能性很小; python.org是一个完善的域名)
  2. 您的DNS服务器已关闭(不太可能;如果您可以浏览其他站点,则应该可以通过Python获取该页面)
  3. 防火墙阻止Python或脚本访问Internet(很可能; Windows防火墙有时不会问你如果你想允许一个应用程序)
  4. 你住在一个古老的伏都教墓地。 (不太可能;如果是这种情况,你应该搬出去)