python - 异常处理:评估多个语句
问题描述
使用 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 中我不知道等效项)?
解决方案
这不是一个理想的解决方案,但您可以装饰函数以忽略异常,然后使用装饰函数而不是原始函数:
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)
推荐阅读
- firebase - 先写错误。身份验证中有一个帐户,但firestore中没有用户数据
- javascript - 使用 javascript 预处理 Zabbix 提取 json
- mysql - 如何在调用下一个代码之前等待循环完成
- javascript - 我有多个复选框和多个文本输入。如果复选框被选中,则需要启用它旁边的文本输入
- jmeter - 启用或禁用 API 参数
- python - AssertionError:Strides 16 16 在detectron2 中不是log2 连续的
- android-studio - Android studio 4.2 Gradle 同步失败
- reactjs - 如何更改material-ui/lab/Autocomplete的背景颜色
- mysql - 如果仅提供值,则检查唯一性
- python - 如何使用 selenium python 在悬停的 highcharts 上抓取值?