# laberge — Gestion immobilière Laberge
- site: https://www.laberge.qc.ca/recherche
- méthode: html (page liste rendue serveur + fiches unités)
- annonces: 54 → 54
- couverture après (sur 54 annonces): prix 100%, adresse 100%, dispo 100%, superficie 7%, commodités 100%
- fixture: ok · test: ok (2 passed)
## Champs extraits
- **Page liste (/recherche)** : complexe, adresse de la carte, ville (filtre Québec/Lévis/L'Ancienne-Lorette), type d'unité, prix « Débutant », disponibilité, code d'unité (`data-href`).
- **Fiche unité** (via `self.detail()`, cache BD, max 150 nouveaux fetchs/sync) :
- bloc structuré h3→p « Grandeur / Étage / Disponibilité / Superficie / Débutant » : `area_sqft` explicite (structuré à la source), `details.floor`, dispo de secours ;
- adresse complète de l'immeuble **avec code postal** (h3 « Adresse », lien « Autres adresses » retiré) ;
- secteur (arrondissement) depuis le `
` (Beauport, Sainte-Foy, etc. — 9 secteurs) ;
- inclusions de l'unité (pictos non grisés : Chauffage/Électricité/Eau chaude, Poêle et réfrigérateur, Lave-vaisselle, Air climatisé…) ;
- **caractéristiques en liste `- `** (nouveau) : « Entrée laveuse, sécheuse », « Balcon privé : 72 pi² », « Stationnement extérieur : inclus », hauteur de plafonds, insonorisation… ;
- **services de l'immeuble + dispositifs de sécurité** (nouveau) : buanderie, rangement, stationnement intérieur/extérieur, ascenseur, carte d'accès, caméra, intercom, accès mobilité réduite ;
- description marketing du complexe, photos de l'unité.
## Champs indisponibles à la source
- Superficie publiée sur ~7 % des unités seulement (immeubles récents comme Le 224) ; idem pour l'étage.
- Politique animaux / fumeur : jamais mentionnée.
- Meublé : seulement l'avertissement générique « frais additionnels pour semi-meublés » (pas par unité).
- Lat/lng du complexe : absent (seuls les POI « À proximité » ont des coordonnées — non utilisés).
## Fragilités
- Détection des inclusions par pictogrammes : repose sur `style="color:#ccc"` / suffixe `_off.` des SVG pour les exclusions.
- L'adresse des complexes multi-immeubles (Le Charleroi) ne donne que la première adresse ; « Autres adresses » est dans un collapse non extrait.
- Les lignes du tableau des unités mêlent logements et stationnements/rangements : filtre regex `EXCLUDE_UNIT_RE`.
- Le secteur vient du `` — dépend du format « Appartement - - ».
## Améliorations apportées
- Fiches unités passées sur `self.detail()` (cache BD ; auparavant les 54 fiches étaient re-visitées à chaque sync) avec budget `max_details=150` (exception `_DetailBudget`).
- `area_sqft` et `details.floor` extraits du bloc structuré h3→p (auparavant : injectés en texte dans la description).
- Adresse enrichie du code postal depuis la fiche (avant : adresse de carte sans code postal, parfois liste de 6 numéros civiques).
- Commodités : ajout des listes `
- ` de caractéristiques (auparavant ignorées) + services d'immeuble + dispositifs de sécurité → 0 annonce sans commodités (avant : 6) ; `details.parking/inclusions` dérivés présents sur 54/54.
- Dédup des libellés, nettoyage des espaces multiples dans les `
- `.
## Échantillon avant/après
**Le 224 — 3½ (#1-0614)** (1490 $, dispo now, 742 pi²)
- avant : address=`224, rue seigneuriale`, amenities=6 pictos, details=`{"inclusions":{"hot_water":true},"appliances":{"fridge":true,"dishwasher":true,"washer_dryer_hookup":true},"ac":true,"floor":6}`
- après : address=`224 rue seigneuriale, Québec, G1E 0M8`, amenities=29 items (quartz, insonorisation, stationnements, sécurité…), details=`{"inclusions":{"heating":false,"hot_water":true},"appliances":{fridge,stove,dishwasher,washer_dryer_hookup},"ac":true,"elevator":true,"balcony":true,"storage":true,"parking":{"available":true,…},"floor":6}` + area_sqft=742 structuré
**Le 2910 Canardière — 4½ (#2910-34)** (1090 $, Septembre 2026)
- avant : details=`{"inclusions":{"heating":true,"hot_water":true}}`, address sans code postal
- après : details=`{"inclusions":{"heating":true,"hot_water":true},"appliances":{"washer_dryer_hookup":true},"balcony":true,"laundry":true,"storage":true,"parking":{"available":true,"type":"extérieur"}}`, address=`2910 boulevard Mgr Gauthier, Québec, G1E 2V2`
## Lacune générique de normalisation détectée
- `normalize.py` : le motif négatif de `heating` (`non chauffe`) matche « Stationnement intérieur **non chauffé** : des frais… » → `inclusions.heating=false` erroné pour Le 224 alors que seul le stationnement est non chauffé. Le motif devrait exclure le contexte « stationnement/garage ».