You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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)

关键说明

  1. 房源容器定位:先找到每个房源的父容器(如示例中的listing__item),确保遍历的是单个房源的所有信息,而非单独字段的所有元素。
  2. 字段判断逻辑:对每个字段对应的图标元素做存在性判断,存在则提取相邻节点的文本并做清洗(如提取数字),不存在则直接赋值None。
  3. DataFrame构建:将每个房源的信息存入字典后收集到列表,最终转成DataFrame时,缺失的None会被pandas自动转为NaN,保证数据结构统一。

内容的提问来源于stack exchange,提问作者znah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:43:33