簡體   English   中英

Python urllib2 URLError異常?

[英]Python urllib2 URLError exception?

我在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>
import urllib2
response = urllib2.urlopen('http://www.python.org/fish.html')
html = response.read()

你這樣做是錯的。

看一下urllib2源中由traceback指定的行:

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指出的那樣,您的代碼是錯誤的。

名稱解析錯誤。

getaddrinfo用於解析您的請求中的主機名( python.org )。 如果失敗,則表示無法解析該名稱,因為:

  1. 它不存在,或者記錄已過時(不太可能; python.org是一個完善的域名)
  2. 您的DNS服務器已關閉(不太可能;如果您可以瀏覽其他站點,則應該能夠通過Python獲取該頁面)
  3. 防火牆阻止Python或您的腳本訪問Internet(最有可能; Windows防火牆有時不詢問您是否要允許應用程序)
  4. 您住在古老的伏都教公墓。 (不太可能;如果是這種情況,您應該搬出)

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
>>>

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM