如何用BeautifulSoup的find_next_sibling()为不存在的变量设Null值
房产网页爬取:缺失数据填充Null/None解决方案
问题描述
爬取Argenprop网站的房源数据,目标提取建筑面积、房龄、卧室数量等字段并构建DataFrame。此前通过find_next_sibling()解决了目标数据位于相邻节点的问题,但当前遇到部分房源缺失部分字段的情况——不同字段的列表长度不一致(例如部分字段有20条数据,部分仅17条),需要为缺失位置填充None,尝试用if判断元素存在性但不知具体实现。
原实现代码:
page = ("https://www.argenprop.com/departamento-alquiler-barrio-palermo-2-ambientes") page_requests = requests.get(page) soup_page = BeautifulSoup(page_requests.content, "html.parser") data = [] for i in soup_page.find_all('i', 'icono-superficie_cubierta'): data.append(i.find_next_sibling()) lista_data = [] superficie_cubierta = [] for i in data: lista_data.append(i.text.strip()) for i in lista_data: superficie_cubierta.append(str(i[0])+str(i[1]))
解决方案
核心思路是先定位单个房源的容器元素,再针对每个房源单独提取所有字段,确保每个房源的字段一一对应,缺失字段直接赋值None,避免因单独提取字段导致的长度不匹配问题。
具体实现代码
import requests from bs4 import BeautifulSoup import pandas as pd page_url = "https://www.argenprop.com/departamento-alquiler-barrio-palermo-2-ambientes" page_requests = requests.get(page_url) soup_page = BeautifulSoup(page_requests.content, "html.parser") # 定位所有房源卡片容器(需根据网站实际DOM结构调整class名称) property_cards = soup_page.find_all('div', class_='listing__item') data_list = [] for card in property_cards: property_info = {} # 提取建筑面积:判断元素是否存在,存在则取值,否则设为None area_icon = card.find('i', 'icono-superficie_cubierta') if area_icon: area_text = area_icon.find_next_sibling().text.strip() # 提取数字部分(根据实际文本格式调整处理逻辑) property_info['superficie_cubierta'] = ''.join([c for c in area_text if c.isdigit()]) or None else: property_info['superficie_cubierta'] = None # 提取房龄 age_icon = card.find('i', 'icono-antiguedad') if age_icon: property_info['antiguedad'] = age_icon.find_next_sibling().text.strip() else: property_info['antiguedad'] = None # 提取卧室数量 bedroom_icon = card.find('i', 'icono-dormitorios') if bedroom_icon: bedroom_text = bedroom_icon.find_next_sibling().text.strip() property_info['dormitorios'] = ''.join([c for c in bedroom_text if c.isdigit()]) or None else: property_info['dormitorios'] = None data_list.append(property_info) # 构建DataFrame,缺失值自动转为NaN df = pd.DataFrame(data_list) print(df)
关键说明
- 房源容器定位:先找到每个房源的父容器(如示例中的
listing__item),确保遍历的是单个房源的所有信息,而非单独字段的所有元素。 - 字段判断逻辑:对每个字段对应的图标元素做存在性判断,存在则提取相邻节点的文本并做清洗(如提取数字),不存在则直接赋值
None。 - DataFrame构建:将每个房源的信息存入字典后收集到列表,最终转成DataFrame时,缺失的
None会被pandas自动转为NaN,保证数据结构统一。
内容的提问来源于stack exchange,提问作者znah
相关产品推荐
相关产品推荐

