# leclif — Le Clif (condos locatifs, Charlesbourg) - site: https://leclif.ca/ - méthode: html (mono-page : 151 overlays d'unités, script jQuery marque les louées) - annonces: 9 → 9 - couverture après (sur 9 annonces): prix 100%, adresse 100%, dispo 100%, superficie 100%, commodités 100% - fixture: ok · test: ok (2 passed) ## Champs extraits - **Par unité (overlay)** : numéro, prix « À partir de NNN (incluant électros) $ / mois », disponibilité (« Disponibilité : octobre »), type (5½…), modèle, **superficie → `area_sqft` structuré** (champ étiqueté « Superficie : », distinct de « Terrasse : »), terrasse (description), aperçu du plan (jpg) + plan PDF. - **Immeuble (nouveau)** : liste des avantages `ul.liste-icones` → 15 commodités réelles (eau chaude fournie, internet inclus, air climatisé inclus, piscine extérieure chauffée, gym tout équipé, salle commune, golf virtuel, terrasse sur le toit, rangements vélos $, stationnements int/ext $, borne électrique $, feux de camp…). - **`pets="conditions"` structuré (nouveau)** : l'item « Chiens et chats acceptés » porte une infobulle détaillant les conditions (chiens selon étage/poids <50 lb, deux chats max) → libellé « (sous conditions) » + champ pets explicite. - **lat/lng (nouveau)** : extraits du lien Google Maps de la page (`!3d46.8934679!4d-71.2986717`). - Adresse complétée du code postal **G1G 0L1** (affiché sur la page). ## Champs indisponibles à la source - Meublé : non mentionné. - Étage de l'unité : non affiché (déductible du numéro mais ce serait une inférence — non faite). - Chauffage inclus/exclu : jamais énoncé explicitement (voir lacune générique ci-dessous). ## Fragilités - Les unités louées sont détectées via le script inline `jQuery('.unite-N').addClass('non-dispo')` — fragile si le thème change. - Les électroménagers sont « moyennant des frais mensuels » au niveau immeuble mais « incluant électros » dans le prix de certaines unités : ambigu à la source. - L'infobulle animaux est le seul endroit où les conditions apparaissent (sélecteur `.is-description`). ## Améliorations apportées - **Bug corrigé** : `area_sqft` prenait la superficie de la **terrasse** (min des superficies de la description : 176 pi² < 1156 pi²). Champ « Superficie : » désormais parsé en structuré → 100 % correct. - Commodités : de 0 (`amenities=[]` sur 9/9) à 15 items réels → `details` passe de `{balcony, price_from}` à `{inclusions{hot_water,internet}, appliances, ac, pool, gym, storage, parking{type,included:false}, pets}`. - `pets="conditions"` structuré (avant : None). - lat/lng de l'immeuble (avant : géocodage). - Code postal ajouté à l'adresse. ## Échantillon avant/après **Le Clif — Unité 115 (5½)** (2366 $, octobre) - avant : area_sqft=176 (terrasse !), pets=None, amenities=[], details=`{"balcony":true,"price_from":true}`, lat/lng absents - après : area_sqft=1156, pets=`conditions`, amenities=15 items, details=`{"inclusions":{"hot_water":true,"internet":true,…},"ac":true,"pool":true,"gym":true,"storage":true,"parking":{"available":true,"type":"intérieur et extérieur","included":false},"pets":"conditions","price_from":true}`, lat=46.8934679/lng=-71.2986717 ## Lacunes génériques de normalisation détectées - « Piscine extérieure **chauffée** » déclenche `inclusions.heating=true` (motif `chauffe[e]? ` trop large — même famille que le faux négatif « stationnement non chauffé » vu sur laberge). Le motif chauffage devrait ignorer piscine/stationnement/garage chauffés. - « Cinq électroménagers (moyennant des frais **mensuels**) » n'est pas neutralisé par `_NEUTRAL_RE` (qui couvre « sur demande / en option / $ ») → `appliances.fridge=true` dérivé alors que c'est une option payante.