2009-08-17 124 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. 你住在一個古老的伏都教墓地。 (不太可能;如果是這種情況,你應該搬出去)