1

エラー 60 をキャッチして、スクリプトの実行を続行しようとしています。現在行っていることは次のとおりです。

import urllib2
import csv
from bs4 import BeautifulSoup


matcher = csv.reader(open('matcher.csv', "rb" ))

for i in matcher:
    url = i[1]
    if len(list(url)) > 0:
        print url
        try:
            soup = BeautifulSoup(urllib2.urlopen(url,timeout=10))   

        except urllib2.URLError, e:
            print ("There was an error: %r" % e)

これを返します:

トレースバック (最新の呼び出しが最後): ファイル "debug.py"、13 行目、スープ = BeautifulSoup(urllib2.urlopen(url,timeout=10)) ファイル "/Library/Frameworks/Python.framework/Versions/2.7/lib /python2.7/urllib2.py"、126 行目、urlopen return _opener.open(url, data, timeout) ファイル "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py "、400行目、open response = self._open(req, data) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py"、418行目、_open '_open ', req) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 378, in _call_chain result = func(*args) File "/Library/Frameworks/Python .framework/Versions/2.7/lib/python2.7/urllib2.py"、1207 行目、in http_open return self.do_open(httplib.HTTPConnection, req) ファイル "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py"、1180 行目、do_open r = h.getresponse( buffering=True) ファイル "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py"、1030 行目、getresponse response.begin() ファイル "/Library/Frameworks/Python.framework /Versions/2.7/lib/python2.7/httplib.py"、407 行目、開始バージョン、ステータス、理由 = self._read_status() ファイル "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2 .7/httplib.py"、365 行目、_read_status 行 = self.fp.readline() ファイル "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py"、447 行目、 readline data = self._sock.recv(self._rbufsize) socket.timeout: タイムアウトしました

このエラーをキャッチして「続行」するにはどうすればよいですか?

4

2 に答える 2

4

例外オブジェクトをインポートして、exceptブロックを変更できます。

import socket

try:
    soup = BeautifulSoup(urllib2.urlopen(url,timeout=10))   

except urllib2.URLError as e:
    print ("There was an error: %r" % e)
except socket.timeout as e: # <-------- this block here
    print "We timed out"

update : さて、何か新しいことを学びました -.reasonプロパティへの参照を見つけました:

except urllib2.URLError as e:
    if isinstance(e.reason, socket.timeout):
        pass # ignore this one
    else:
        # do stuff re other errors if you can...
        raise # otherwise propagate the error
于 2012-11-08T07:43:07.133 に答える
1

except Exception as e:すべてのエラーをキャッチしようとすることができます。ただし、これはすべてのエラーをキャッチすることに注意してください。特定のエラーのみをキャッチする場合は避ける必要があります。

編集: 次のようにして、例外の種類を確認できます。

except Exception as e:
    exc_type, exc_obj, exc_tb = sys.exc_info()
    fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]      
    print(exc_type, fname, exc_tb.tb_lineno)
于 2012-11-08T07:54:59.210 に答える