Python try/except:尝试多种选项
我正在尝试从一些网页上抓取信息,但这些网页上信息的位置不太一致。我已经写了代码来处理几种可能性;我想要的是按顺序尝试这些可能性,如果都不成功,我希望能够优雅地失败,然后继续进行。
也就是说,简单来说就是:
try:
info = look_in_first_place()
otherwise try:
info = look in_second_place()
otherwise try:
info = look_in_third_place()
except AttributeError:
info = "Info not found"
我可以用嵌套的尝试语句来实现,但如果我需要尝试15种可能性,那我就得缩进15层!
这个问题看起来很简单,我觉得我可能漏掉了什么,但我搜索了很久,找不到任何类似的解决方案。有没有什么合理且符合Python风格的方法来处理这个问题呢?
补充说明:正如约翰(他的解决方案挺不错)的回答所提到的,为了简洁起见,我在上面把每个查找写成了一个函数调用,而实际上通常是一些小的BeautifulSoup调用,比如 soup.find('h1', class_='parselikeHeader')
。当然,我可以把这些封装成函数,但对于这么简单的代码块来说,这样做似乎有点不够优雅——如果我的简化改变了问题,我表示歉意。
这可能是一个更有用的例子:
try:
info = soup.find('h1', class_='parselikeHeader').get('href')
if that fails try:
marker = soup.find('span', class_='header')
info = '_'.join(marker.stripped_strings)
if that fails try:
(other options)
except AttributeError:
info = "Info not found"
1 个回答
9
如果每次查找都是一个单独的函数,你可以把所有这些函数放在一个列表里,然后一个一个地执行它们。
lookups = [
look_in_first_place,
look_in_second_place,
look_in_third_place
]
info = None
for lookup in lookups:
try:
info = lookup()
# exit the loop on success
break
except AttributeError:
# repeat the loop on failure
continue
# when the loop is finished, check if we found a result or not
if info:
# success
else:
# failure