# sibelanger — Société immobilière Bélanger - site: https://sibelanger.com/appartements-a-louer/ (+ pages détail /appartements-a-louer//) - méthode: html - annonces: 13 → 12 (1 annonce périmée retirée par le diff) - couverture après (sur 12 annonces): prix 100%, adresse 100%, dispo 100%, superficie 75%, commodités 100% - fixture: ok · test: ok ## Champs extraits - Cartes liste : titre, secteur, prix, disponibilité (« Libre en septembre »), type (« 3 ½ », « Maison de ville »), icônes de caractéristiques (attributs title : Non meublé, Entrée laveuse-sécheuse, Balcon, Chauffé…), data-unit-id (external_id stable), carrousel de photos. - Pages détail (nouveau) : **adresse civique complète avec code postal** (« 1175, rue de Chamonix, Québec (QC) G1H 6M3 »), **superficie** depuis « Plan de l'unité … pi2 » (texte brut → parse par finalize), **description riche** (contenu WP complet au lieu du og:description), **commodités de l'appartement + commodités de l'immeuble** (Service de maintenance 24/7, Stationnement extérieur/intérieur…), disponibilité de repli, galerie complète. - Dérivés par finalize() : smoking (« Environnement sans fumée »), parking (« 1 stationnement inclus »), contact (téléphone de l'agente dans la description), furnished (« Non meublé »), price_from. ## Champs indisponibles à la source - lat/lng : aucune coordonnée dans le HTML. - Animaux : politique jamais mentionnée (ni carte, ni fiche). - Superficie absente sur 3 fiches (pas de plan d'unité publié). ## Fragilités - L'adresse affichée sur la fiche « Wilfrid-Pelletier - Unité 401 » est « 3060, Rue Antoine-Du Verdier » (même immeuble/complexe ou coquille du site) : on reprend fidèlement ce que la source publie. - « Entrée lave-vaisselle » (une entrée, pas l'appareil) est classée `appliances.dishwasher: true` par la normalisation générique — voir lacune ci-dessous. - Cache détail calé sur titre|prix|dispo de la carte : une modification de description seule ne re-déclenche pas le téléchargement de la fiche. ## Améliorations apportées - Pages détail désormais visitées via `self.detail()` (cache BD) avec plafond de vraies requêtes (`max_details=60`) — avant : og:description + images à CHAQUE sync. - Adresse : slug deviné (« 350, Chemin Ste-Foy ») → adresse civique complète publiée sur la fiche (avec code postal). Reste en repli si la fiche est indisponible. - Superficie 0 % → 75 % (span .single-unit__plan-surface). - Commodités enrichies (appartement + immeuble) ; « Services de proximité » (épicerie, parc…) volontairement exclus pour ne pas polluer. - Description complète nettoyée des invites « Demander une visite ». ## Échantillon avant/après - Chamonix - Unité 197 — avant : adresse « 1175, Chamonix » (slug), pas de superficie, description = og:description ; après : « 1175, rue de Chamonix, Québec (QC) G1H 6M3 », 1360 pi², description complète, + smoking false, parking inclus, contact 581-702-2720. - Samuel de Champlain - 304 — avant : superficie NULL ; après : 938 pi², commodités immeuble ajoutées. - Wilfrid-Pelletier - Unité 401 — avant : adresse « 962, Wilfrid Pelletier » (dérivée du slug) ; après : adresse publiée par la source (3060, Rue Antoine-Du Verdier, G1W 4X9). ## Lacune générique de normalisation (à traiter dans normalize.py, non contournée ici) - « Entrée lave-vaisselle » / « sortie lave-vaisselle » devrait donner `dishwasher_hookup` (comme washer_dryer_hookup) et non `dishwasher: true` — la règle `dishwasher: (r"lave[- ]vaisselle|dishwasher")` matche l'entrée seule.