使用BeautifulSoup未找到指定类时如何追加整数或NaN?代码逻辑异常求助
问题解决思路
核心问题分析
- 当
soup.find_all找不到指定类的span元素时,外层循环会直接跳过,rooms_bed列表不会被追加任何默认值。 - 内层循环遍历
a.select('title')的结果时,如果当前span里没有title标签,这个循环根本不会执行,导致if len(s)==0的判断永远触发不了——因为s是循环中的单个元素,不存在长度为0的情况。
修正后的代码
import numpy as np from bs4 import BeautifulSoup # 假设soup已完成初始化 rooms_bed = [] # 先获取所有目标span元素 target_spans = soup.find_all("span", attrs={"class":"no-svg-bed-icon bed-icon seperator"}) # 处理页面中完全没有目标span的情况 if not target_spans: rooms_bed.append(np.nan) # 也可以替换为你需要的整数,比如0 else: for a in target_spans: # 获取当前span下的所有title标签 title_tags = a.select('title') # 判断是否存在title标签 if not title_tags: rooms_bed.append(np.nan) # 无title时追加默认值 else: # 提取第一个title的文本(若有多个可根据需求调整) text_content = title_tags[0].get_text().strip() rooms_bed.append(text_content) number_bedrooms = [] for x in rooms_bed: # 过滤非字符串类型,避免NaN/整数触发报错 if isinstance(x, str) and "bedrooms" in x: # 清理文本并转换为整数 num = int(x.replace('bedrooms', '').strip()) number_bedrooms.append(num) else: # 未匹配到内容时追加默认值 number_bedrooms.append(np.nan)
关键优化点
- 先捕获“无目标span”的场景,确保默认值能被正确追加。
- 直接判断
select返回的title标签列表是否为空,而非遍历单个元素判断长度。 - 文本处理时加上
strip(),避免多余空格导致整数转换失败。 - 处理
number_bedrooms时增加类型判断,防止非字符串值触发报错。
内容的提问来源于stack exchange,提问作者Federico Gottardi
相关产品推荐
相关产品推荐

