在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
相关产品推荐
相关产品推荐

