# roussin — Immeubles Roussin - site: https://immeublesroussin.com/location-condo-appartement-quebec/ - méthode: html (micro-pages d'immeubles WordPress/Elementor) - annonces: 36 → 36 - couverture après (sur 36 annonces): prix 100%, adresse 100%, dispo 0%, superficie 0%, commodités 100% - fixture: ok · test: ok ## Champs extraits - Index → pages immeuble ; par immeuble : nom (title), adresse civique (regex, bureau administratif exclu), secteur (Sainte-Foy/Lévis/Beauport…), description (og:description), galerie wp-content, lignes de prix « X ½ à partir de NNN$ » → une annonce par type d'unité. - **NOUVEAU — commodités** : paires icône (`iconeGym.jpg`…) + widget texte Elementor → amenities fidèles (« Gym », « Eau chaude », « Stationnement intérieur », « Wifi inclus », « Animaux acceptés (20lb et moins) », « Complexe sans fumée », « Ascenseur »…). 0 % → 100 %. finalize() en dérive inclusions/parking/pool/gym/ac/pets/smoking. - **NOUVEAU — contact** : liens `tel:`/`mailto:` structurés → `details.contact` (418-651-9443, info@immeublesroussin.com — contact locatif du gestionnaire, identique pour tous les immeubles). ## Champs indisponibles à la source - Disponibilité (aucune unité datée ni compteur « disponible » sur le site). - Superficies (aucun pi² publié). - Prix exacts par unité (seulement « à partir de » par type — `details.price_from=true`). - lat/lng, étage, meublé. ## Fragilités - Amenities dépendent de la convention Elementor « icône + texte court dans le même container » — vérifiée sur 4 gabarits de pages différents. - L'adresse vient d'une regex sur le HTML brut (première adresse civique hors « bureau »). - Lignes de prix parsées sur le texte de page (PRICE_LINE_RE) : sensible aux reformulations. ## Améliorations apportées - Extraction des commodités Elementor (icône+texte), propagées à chaque annonce de type d'unité de l'immeuble. - `details.contact` (téléphone + courriel) depuis les liens structurés. - Fixture (10 requêtes) + tests ok. ## Échantillon avant/après - AVANT : `L'Aromate — 3½ | 1595 | amenities=[] | details={"price_from": true}` - APRÈS : `L'Aromate — 3½ | 1595 | amenities=["Gym","Eau chaude","Terrasse sur le toit","Stationnement intérieur","Wifi inclus","Piscine",…] | details={inclusions:{hot_water,internet}, ac, pool, gym, parking:{intérieur, inclus}, contact:{phone,email}, price_from}` - APRÈS : `Lallie — Loft | pets="oui"` (source : « Animaux acceptés (20lb et moins) » — voir lacune générique : la limite de poids devrait donner "conditions").