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

在BeautifulSoup中如何区分带href和不带href的a标签以解决爬虫报错?

解决方案

报错的核心原因是部分<a>标签没有href属性,直接用['href']下标访问不存在的属性会抛出KeyError,共有三种高效的修复方式可选:


方案1:查找时直接过滤带href属性的标签

调用find_all时传入href=True参数,BeautifulSoup会直接筛选出所有携带href属性的<a>标签,不需要后续额外判断:

def id_finder(url):
    id_list = []
    r = requests.get(url)
    soup = BeautifulSoup(r.text, 'html.parser')
    # 仅返回带href属性的a标签
    ads_ids = soup.find_all('a', href=True)
    for ID in ads_ids:
        link = ID['href']
        if '/car-search/' in link:
            pass
        else:
            print(link)

方案2:用get()方法安全获取属性

Tag.get(属性名)方法在属性不存在时会默认返回None,不会抛出异常,适合需要同时处理带/不带href标签的场景:

def id_finder(url):
    id_list = []
    r = requests.get(url)
    soup = BeautifulSoup(r.text, 'html.parser')
    ads_ids = soup.find_all('a')
    for ID in ads_ids:
        link = ID.get('href')
        # 跳过无href的标签
        if not link:
            continue
        if '/car-search/' in link:
            pass
        else:
            print(link)

方案3:提前判断属性是否存在

用BeautifulSoup标签对象的has_attr()方法先判断属性是否存在,再做后续处理:

def id_finder(url):
    id_list = []
    r = requests.get(url)
    soup = BeautifulSoup(r.text, 'html.parser')
    ads_ids = soup.find_all('a')
    for ID in ads_ids:
        if not ID.has_attr('href'):
            continue
        link = ID['href']
        if '/car-search/' in link:
            pass
        else:
            print(link)

额外优化提示

原有代码中的if link.find('/car-search/')逻辑存在漏洞:str.find()方法匹配不到内容时返回-1(布尔值为真),匹配到内容且起始位置为0时返回0(布尔值为假),容易出现判断错误,直接用if '/car-search/' in link判断子串是否存在,逻辑更清晰不易出错。


内容的提问来源于stack exchange,提问作者pickle rick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:18:03