You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 12:00:58