# 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 `<ul><li>`** (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 `<title>` — dépend du format « Appartement - <secteur> - <complexe> ». ## 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 `<ul><li>` 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 `<li>`. ## É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 ».