Python的urllib2的URLError异常?(Python urllib2 URLError

2019-10-17 07:38发布

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

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>

Answer 1:

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

你这样做是错的。



Answer 2:

已经在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指出,你的代码是错误的。



Answer 3:

名称解析错误。

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

  1. 它不存在,或者记录过时(可能性很小; python.org是一个完善的域名)
  2. 你的DNS服务器停机(可能性很小;如果您可以浏览其他网站时,你应该能够通过Python来获取该页面)
  3. 防火墙是访问互联网封锁Python或脚本(最有可能的; Windows防火墙有时,如果你想允许应用程序不要求你)
  4. 你住在一个古老的巫术墓地。 (不太可能,如果是这样的话,你应该迁出)


Answer 4:

Windows Vista中,蟒蛇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
>>>


Answer 5:

DJ

首先,我看不出有任何理由要导入的urllib; 我只是见过用来完全取代的urllib的urllib2我所知,没有功能,是从urllib的有用,然而从失踪的urllib2。

接下来,我注意到http://www.python.org/fish.html给出了一个404错误给我。 (这并不说明你看到的回溯/例外,我得到urllib2.HTTPError: HTTP Error 404: Not Found

一般来说,如果你只想做一个默认的网页抓取(没有加入特殊的HTTP头,做着做着任何种类的帖子,等等),那么以下就足够了:

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


文章来源: Python urllib2 URLError exception?