# contraste — Contraste Immobilier - site: https://contrasteimmobilier.ca (accueil → pages immeubles /appartements//) - méthode: html - annonces: 231 → 231 - couverture après (sur 231 annonces): prix 85%, adresse 100%, dispo 100%, superficie 0%, commodités 100% - fixture: ok · test: ok ## Champs extraits - title, unit_type, price/price_label, availability, images : attributs `data-*` des cartes `div.building-stack-unit` (plugin « api-building-stack ») sur la page immeuble. - address : titre Elementor complet (« 4855 rue de L'Escarpement, Québec, Québec, G3K0N8 »), avec repli sur l'adresse courte du hero des pages « projet » (« 2784 ave Sasseville » pour Ellipse / Émergence II, qui n'affichent pas de ville). sector dérivé de l'adresse ; city via infer_city + carte d'accueil. - amenities : NOUVEAU — liste CARACTÉRISTIQUES de l'immeuble (répéteur JetEngine `.jet-listing-dynamic-repeater__item span`) : inclusions, animaux, stationnement, électroménagers… + type de bâtiment `data-housing-type` (« Maison de ville ») quand présent. - details.contact : NOUVEAU — courriel/téléphone « Pour prendre rendez-vous » exposés dans les titres Elementor de la page immeuble (structuré, pas déduit du texte). - description : meta og:description (texte complet du projet). - area_sqft : lu depuis `data-size` mais uniquement si plausible (80–20 000) — chez Contraste l'attribut vaut toujours « 0 », donc None aujourd'hui ; l'extraction s'activera d'elle-même si le gestionnaire remplit le champ. ## Champs indisponibles à la source - Superficie : `data-size="0"` partout, aucune mention en pi² dans les pages. - Prix des immeubles Focus I/II : `data-price="0"` (la carte n'affiche aucun prix) — 34 unités restent volontairement sans prix (avant, elles portaient un faux « 0$/mois »). - Étage, meublé, lat/lng : non exposés. - animaux : seulement en texte libre (« Chats autorisés, certaines conditions s'appliquent »). ## Fragilités - Dépend du plugin WordPress « api-building-stack » (attributs data-pid/data-name/data-rooms/ data-price) : un changement de thème casserait le parsing. - La liste des immeubles vient des cartes de la page d'accueil (`a[href*="/appartements/"]`). - Filtre géographique par ville de la carte d'accueil (Beaupré exclue) — si la carte omet la ville, l'immeuble passe avec défaut « Québec ». - LACUNES GÉNÉRIQUES de normalisation constatées ici (non contournées localement) : 1. « Non chauffé et éclairé » → inclusions.heating=true (faux positif : le motif positif `chauffe ` matche « chauffé et » ; « non chauffé » n'est pas un motif négatif reconnu — « Non chauffé, non éclairé » passe par chance à cause de la virgule). 2. « Chats autorisés (…sous conditions) » n'est reconnu par aucun motif pets → pets reste None alors que la source l'affiche (devrait donner « conditions »). 3. « Électroménagers selon disponibilités ($) » / « sur demande ($) » → appliances.fridge=true (les électroménagers ne sont pas inclus, ils sont en option payante). ## Améliorations apportées - Extraction des commodités d'immeuble (CARACTÉRISTIQUES) → amenities pour chaque unité (avant : amenities toujours vide, 231/231). - Adresse de repli pour les pages « projet » (Ellipse, Émergence II) → 100 annonces qui n'avaient aucune adresse en ont maintenant une. - `data-price="0"` traité comme « prix non affiché » (avant : price_label « 0$/mois » inventé). - details.contact (email + téléphone location) quand la page l'affiche. - `data-housing-type` ajouté aux amenities ; `data-size` branché (inactif tant que la source le laisse à 0). ## Échantillon avant/après Agora Phase 2 — unité 206 - avant : 1519.0 | 4½ | Bientôt disponible (01 décembre 2026) | 2026-12-01 | area=None | pets=None | details={"floor": 2} | 4855 rue de L'Escarpement, Québec, Québec, G3K0N8 | amenities=[] - après : 1519.0 | 4½ | Bientôt disponible (01 décembre 2026) | 2026-12-01 | area=None | pets=None | details={"inclusions":{"heating":true,"internet":true},"appliances":{"fridge":true,"washer_dryer_hookup":true},"ac":true,"parking":{"available":true,"type":"extérieur"},"floor":2,…} | même adresse | amenities=[Non chauffé et éclairé, Entrée laveuse-sécheuse, Internet inclus, Air climatisé, Chats autorisés *sous conditions, Électroménagers sur demande*($), Stationnement extérieur ($)] ELLIPSE — unité 101 - avant : prix ok | 4½ | Disponible | now | address="" | details={} - après : prix ok | 4½ | Disponible | now | address="2784 ave Sasseville" | details={"inclusions":{"heating":true,"electricity":true,"hot_water":true,"internet":true},"appliances":{"fridge":true,"stove":true},"ac":true,"gym":true,"parking":{"available":true,"type":"intérieur"},"contact":{"email":"location@contrasteimmobilier.ca","phone":"418-520-4412"}}