BeautifulSoup提取嵌套标签文本报NoneType属性错误如何解决
报错根因
AttributeError: 'NoneType' object has no attribute 'text'的触发逻辑是:你对find()返回的空结果(None)调用了.text属性,具体代码问题如下:
- 选择器层级错误:
soup.find_all('div', class_ = 'properties-previews')获取的是最外层的房产列表容器,不是单条房产条目,你跳过了遍历容器下class为preview的单条目节点,直接在容器上查找单条目内的标签,无法匹配到目标元素。 - 类名拼写错误:HTML中价格、面积对应的span类名是双下划线格式
preview__price、preview__size,你的代码写成了单下划线preview_price、preview_size,匹配规则不成立。 - 无判空直接取属性:你在查找区县、位置标签时,直接在
find()结果后链式调用.text,只要页面存在任意一个条目缺失对应标签就会触发报错;另外你查找的preview__locality -g-truncated类在给出的HTML结构中不存在,必然返回None。 - 语法错误:
print(plot_price).text将.text写在了print函数外侧,print的返回值为None,此处调用属性属于语法错误。
正确实现代码
严格按照HTML嵌套层级逐层查找,所有标签查找结果先判空再提取文本,避免页面偶发结构异常导致程序崩溃:
# 获取外层房产列表容器 list_container = soup.find('div', class_='properties-previews') # 遍历容器下所有单条房产条目 for plot_item in list_container.find_all('div', class_='preview'): # 定位到条目内容区域 content_area = plot_item.find('div', class_='preview-content') if not content_area: continue # 提取价格,标签不存在时赋值为空字符串 price_tag = content_area.find('span', class_='preview__price') plot_price = price_tag.text.strip() if price_tag else '' # 提取面积 size_tag = content_area.find('span', class_='preview__size') plot_size = size_tag.text.strip() if size_tag else '' # 提取所属区县 county_tag = content_area.find('h2', class_='preview__subterritory') plot_county = county_tag.text.strip() if county_tag else '' print(f"房产价格:{plot_price}") print(f"房产面积:{plot_size}") print(f"所属区县:{plot_county}")
优化提示
- BeautifulSoup的class匹配为精确匹配,书写选择器时必须和HTML中的类名完全一致,下划线数量、多类名的书写错误都会导致匹配失败。
- 禁止在
find()返回结果上直接链式调用.text,先判断返回值是否为None再提取属性,可规避90%以上的网页解析AttributeError。 - 提取文本后追加
.strip()方法,可自动去除HTML源码中自带的换行、首尾多余空格,得到干净的文本结果。
内容的提问来源于stack exchange,提问作者ela rednax
相关产品推荐
相关产品推荐

