使用BeautifulSoup爬取网页时如何判断指定标签是否存在
问题分析与解决方法
错误原因
你代码里的sal_play = salary.find_all('tr')[1:],find_all()方法返回的是列表类型,切片操作后得到的还是列表。而find_all()是BeautifulSoup的Tag对象或BeautifulSoup对象才有的方法,列表没有这个属性,所以触发了AttributeError。
正确的判断方法
BeautifulSoup的find_all()在找不到匹配标签时,会返回空列表(而不是None),所以判断标签是否存在,直接检查返回的列表是否为空即可。根据你的需求,提供两种常见处理方式:
方式1:直接在原对象上查找目标标签
如果你要找的tr.thead是全局的,直接在salary对象上调用find_all(),然后判断结果是否为空:
# 直接查找目标标签 target_trs = salary.find_all('tr', class_='thead') if not target_trs: print('1') else: # 存在目标标签,执行后续逻辑 for tr in target_trs: # 处理每个匹配的tr标签 pass
方式2:在切片后的子列表中查找
如果必须在sal_play(即salary.find_all('tr')[1:])的范围内查找,需要遍历列表中的每个Tag对象,逐个检查:
sal_play = salary.find_all('tr')[1:] # 遍历子列表中的每个tr标签,筛选出包含目标子标签的项 target_items = [item for item in sal_play if item.find('tr', class_='thead')] if not target_items: print('1') else: # 处理找到的结果 for item in target_items: pass
补充说明
如果只需要查找第一个匹配的标签,可以用find()方法,它找不到时会返回None,此时可以直接用if判断,这种方式更高效:
if salary.find('tr', class_='thead') is None: print('1') else: # 处理第一个匹配的标签 pass
内容的提问来源于stack exchange,提问作者Giacomo Sanguin
相关产品推荐
相关产品推荐

