使用BeautifulSoup网页爬取时如何简化重复的try-except代码?
简化BeautifulSoup爬取中的重复try-except逻辑
你遇到的问题大概率是自定义的datascraping函数参数设计不合理,或是异常捕获范围没覆盖爬取时的常见错误。下面直接给你可用的解决方案:
通用安全爬取函数
这个函数能处理元素查找、文本/属性提取的异常,覆盖select_one和find两种常用查找方式,同时处理元素不存在、无目标内容的情况:
from bs4 import BeautifulSoup def scrape_safe(soup, selector, method='select_one', target='text', default='', strip=True): try: # 根据指定方法定位元素 if method == 'select_one': elem = soup.select_one(selector) elif method == 'find': # find方法的参数需打包成元组传入,比如('span', {'class': 'city'}) elem = soup.find(*selector) else: return default if not elem: return default # 提取目标内容 if target == 'text': result = elem.get_text(strip=strip) return result if result else default else: # 提取属性(如href、src等) return elem.get(target, default) # 捕获爬取时的常见异常 except (AttributeError, TypeError): return default
调用示例
对比你之前重复写的try-except代码,现在可以直接用函数简化:
原冗余代码
try: addr1 = soup.select_one('.addr1').get_text(strip=True) except AttributeError: addr1 = '' try: addr2 = soup.select_one('.addr2').get_text(strip=True) except AttributeError: addr2 = '' try: city = soup.find('span', class_='city').get_text(strip=True) except AttributeError: city = ''
简化后的调用
addr1 = scrape_safe(soup, '.addr1') addr2 = scrape_safe(soup, '.addr2') city = scrape_safe(soup, ('span', {'class': 'city'}), method='find') # 额外示例:提取属性值 detail_link = scrape_safe(soup, '.detail-btn', target='href')
常见报错排查
如果调用时仍报错,先检查这几点:
- 使用
find方法时,是否把参数打包成了元组?比如不能直接传'span', class_='city',要写成('span', {'class': 'city'}) - 是否写错了
method参数?只能是select_one或find - 如果遇到其他异常,可以临时把捕获范围改成
except Exception,排查具体错误类型后再调整捕获列表
内容的提问来源于stack exchange,提问作者JamesHorab
相关产品推荐
相关产品推荐

