Python urllib2 URLError 异常?

1 投票
5 回答
20601 浏览
提问于 2025-04-15 13:39

我之前在一台Windows XP的电脑上安装了Python 2.6.2,然后运行了以下代码:

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>

5 个回答

2

名称解析错误。

getaddrinfo 是用来解析你请求中的主机名(比如 python.org)。如果解析失败,可能是因为:

  1. 这个名字不存在,或者记录过时了(这种情况不太可能;因为 python.org 是一个非常知名的域名)
  2. 你的 DNS 服务器出现故障(这种情况也不太可能;如果你能打开其他网站,说明你应该能通过 Python 获取这个页面)
  3. 有防火墙阻止了 Python 或你的脚本访问互联网(这种情况最有可能;Windows 防火墙有时候不会询问你是否允许某个应用程序)
  4. 你住在一个古老的巫术墓地里。(这种情况不太可能;如果真是这样,你应该考虑搬家)
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所指出的,你的代码本身也有问题。

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

你这样做是不对的。

撰写回答