首页 > 解决方案 > 异常处理:评估多个语句

问题描述

使用 Python 3.8、Selenium 和 BeautifulSoap 抓取网页,我想删除或更改一些元素。由于并非所有页面都包含相应的元素,因此我必须捕获异常:

try:
    soup.find('aside', id="post").decompose()
except Exception:
    pass
try:
    soup.find('footer', id="footer").decompose()
except Exception:
    pass
try:
    soup.find(class_="myclass")["class"] = ''
except Exception:
    pass

这段代码有很多重复(我的语句列表甚至更长),所以我尝试构建一个块:

try:
    soup.find('aside', id="post").decompose()
    soup.find('footer', id="footer").decompose()
    soup.find(class_="myclass")["class"] = ''
except Exception:
    pass

但这不是我想要实现的,因为如果第一个语句没有匹配到,那么下面的语句根本不会被评估。什么是执行/评估所有语句的好、pythonic 和优雅的方式?我读到,使用 pass 也是不好的做法。也许try这里根本不是正确的东西,最好使用isset()PHP 中的东西(但在 python 中我不知道等效项)?

标签: pythonexception

解决方案


这不是一个理想的解决方案,但您可以装饰函数以忽略异常,然后使用装饰函数而不是原始函数:

from functools import wraps

def exceptions_ignored(callee):
    @wraps(callee)
    def _ignore(*args, **kwargs):
        try:
            return callee(*args, **kwargs)
        except Exception:
            pass
    return _ignore

mydivmod = exceptions_ignored(divmod)
# or define it as 
# @exceptions_ignored
# def mydivmod(n, d):
#     return divmod(n, d)

mydivmod(5, 0)

推荐阅读