优化网页抓取脚本中的多try-except代码
网页抓取脚本异常处理优化方案
原代码通过大量重复的try/except块处理网页元素提取时的异常,代码冗余度高。可以通过封装通用的安全提取函数来简化逻辑,同时保持代码可读性。
第一步:封装通用安全提取函数
这个函数接收待处理元素、自定义提取逻辑(用lambda传递)和默认值,统一处理提取过程中常见的IndexError(元素不存在索引报错)、AttributeError(调用不存在的方法/属性报错):
def safe_extract(item, extract_func, default=None): try: return extract_func(item) except (IndexError, AttributeError): return default
注:指定捕获明确的异常类型,比裸
except更安全,避免隐藏未知错误。
第二步:用通用函数重构原代码
将原来的每个try/except块替换为调用safe_extract,代码会更简洁紧凑:
import re # 通用安全提取函数 def safe_extract(item, extract_func, default=None): try: return extract_func(item) except (IndexError, AttributeError): return default # 重构后的业务代码 asin = item.get('data-asin') # 给title补充异常处理,避免找不到元素直接崩溃 title = safe_extract(item, lambda x: x.find_all('span', {'class': 'a-size-base-plus a-color-base a-text-normal'})[0].get_text(), default='') label = safe_extract(item, lambda x: x.find_all('span', {'aria-label': 'Escolha da Amazon'})[0].get('aria-label')) current_whole_price = safe_extract(item, lambda x: x.find_all('span', {'class': 'a-price'})[0].find('span', {'class': 'a-price-whole'}).get_text().replace(',','').replace('.',''), default='0') current_fraction_price = safe_extract(item, lambda x: x.find_all('span', {'class': 'a-price'})[0].find('span', {'class': 'a-price-fraction'}).get_text(), default='0') current_price = float(f"{current_whole_price}.{current_fraction_price}") # 处理评分和评分人数的组合逻辑 def extract_rating(item): rating_info = item.find('div', {'class':'a-row a-size-small'}).get_text() rating = float(rating_info[:3].replace(',','.')) rating_count = int(re.findall(r'\d+', rating_info)[-1]) return rating, rating_count rating, rating_count = safe_extract(item, extract_rating, default=(None, None)) ad = safe_extract(item, lambda x: x.find_all('span', {'class': 'a-color-secondary'})[0].get_text() == 'Patrocinado', default=False) product_data = { 'productId': itemId, 'asin': asin, 'opt_label': label, 'ad': ad, 'title': title, 'current_price': current_price, 'url': f'https://www.amazon.com.br/dp/{asin}', 'rating': rating, 'rating_count': rating_count, }
优化说明
- 代码复用:所有元素提取的异常逻辑集中在
safe_extract,避免重复编写try/except - 灵活性:通过lambda传递自定义提取逻辑,适配从简单属性获取到复杂链式调用+字符串处理的多种场景
- 安全性:明确捕获网页提取的常见异常,不会隐藏未知错误
- 可读性:业务逻辑与异常处理分离,代码结构更清晰
内容的提问来源于stack exchange,提问作者FábioRB
相关产品推荐
相关产品推荐

