Python实现懒执行与异常返回默认值:HTML可选属性提取通用方案
通用HTML提取兜底方案
完全可以通过封装通用异常捕获函数,彻底消除重复编写try-except的冗余代码,且实现逻辑和原有逐块捕获的效果完全等价。
核心通用函数
把重复的异常捕获逻辑单独封装一次,后续所有字段提取都复用这个逻辑即可。
注意:传入的提取逻辑不能直接写表达式执行,需要用lambda包成无参函数延迟执行,否则表达式会在进入try块之前就抛出异常,达不到兜底效果。
def safe_extract(extract_func, default_value): try: # 执行传入的延迟提取函数 return extract_func() except Exception: # 任何提取阶段抛出的异常,统一返回预设默认值 return default_value
替换原有冗余代码
调用时只需要把原来try块里的提取逻辑用lambda包起来,和对应的默认值一起传给通用函数,就能替代原来整块的try-except:
title = safe_extract(lambda: soup.find('h1').text, "b/d") location = safe_extract(lambda: soup.find('a', attrs={'href': '#map'}).text, "none") downside = safe_extract(lambda: soup.find('strong', attrs={'aria-label': 'downside'}).text, "0") incremental = safe_extract(lambda: soup.find('div', attrs={'aria-label': 'incremental'}).contents[3].text, "1") difference = safe_extract(lambda: soup.find('div', attrs={'aria-label': 'difference'}).contents[1].text, "2") part = safe_extract(lambda: soup.find('div', attrs={'aria-label': 'part'}).contents[1].text, "3")
多字段场景的进一步优化
如果待提取的字段数量特别多,可以把所有字段的提取规则、对应默认值提前整理成配置字典,批量生成解析结果,后续新增字段只需要往配置里加一行即可:
# 定义所有字段的提取规则和默认值 rule_config = { "title": (lambda: soup.find('h1').text, "b/d"), "location": (lambda: soup.find('a', attrs={'href': '#map'}).text, "none"), "downside": (lambda: soup.find('strong', attrs={'aria-label': 'downside'}).text, "0"), "incremental": (lambda: soup.find('div', attrs={'aria-label': 'incremental'}).contents[3].text, "1"), "difference": (lambda: soup.find('div', attrs={'aria-label': 'difference'}).contents[1].text, "2"), "part": (lambda: soup.find('div', attrs={'aria-label': 'part'}).contents[1].text, "3"), } # 批量执行提取 parsed_data = { field: safe_extract(extract_func, default) for field, (extract_func, default) in rule_config.items() }
注意事项
- 这种实现和你原来逐块写的try-except逻辑完全等价:不管是找不到DOM元素触发的属性错误,还是访问contents列表时下标越界的索引错误,只要提取流程抛出异常,就会自动返回预设默认值
- 不建议在通用函数里过度收窄异常捕获范围(比如只捕获属性错误),否则会漏掉下标越界这类同样会导致提取失败的异常,和你的原有预期不一致
- 所有提取逻辑都用lambda封装传递,不会改变原有代码的执行顺序和结果,不需要对业务逻辑做任何额外调整
内容的提问来源于stack exchange,提问作者MJavaDev
相关产品推荐
相关产品推荐

