# metcap — MetCap Living - site: https://www.metcap.com/province/quebec?lang=en (villes QC -> /province-search-results -> fiches /apartment/ et /property/) - méthode: html - annonces: 8 → 8 - couverture après (sur 8 annonces): prix 100%, adresse 100%, dispo 100%, superficie 88%, commodités 100% - fixture: ok · test: ok ## Champs extraits - Prix « from $X » (price + price_label « À partir de »), type d'unité (bachelor/1-4 bed), adresse civique complète (H2 de la carte immeuble). - lat/lng structurés depuis l'attribut `onclick="centerMap(..., {lat, lon})"` de la page liste (nouveau). - Tableau « Suite Details » de la fiche unité : statut (Available/Waiting List/Rented -> Disponible/Liste d'attente/Loué), superficie structurée (area_sqft), lits/sdb (dans la description). - Listes structurées de la barre latérale : « Building Amenities » + « Rent Includes » -> amenities brutes ; « Rent Includes » -> details.inclusions{heating, electricity, hot_water…} explicites ; « Pet Friendly » Yes/No -> pets « oui »/« non ». - Contact du bureau de location (téléphone + courriel) -> details.contact. - Description anglaise de la fiche (avant le disclaimer), intersection, photos d'unité (data-bg) avec repli sur la galerie de la fiche immeuble. ## Champs indisponibles à la source - Date de disponibilité précise (seulement un statut Available/Waiting List). - Meublé, étage, année de construction. Superficie absente pour certaines unités (ex. Rue Porier 3 Bedroom : colonne Sq. Ft vide à la source). - « Water » (eau froide) dans Rent Includes n'a pas de clé canonique Lou-Ka — ignoré volontairement. ## Fragilités - Villes filtrées par liste blanche _GM_CITIES (REIT pancanadien) : une nouvelle ville QC hors liste serait ignorée. - Parsing dépendant des classes WordPress (.province-results__item, table.table-listing, h2 de sidebar). - Prix « from $ » = prix plancher par type d'unité ; plusieurs suites physiques partagent la même annonce. ## Améliorations apportées - Fiches unité désormais visitées via self.detail(...) (cache BD, clé = hash de la carte liste) + plafond de 150 vraies requêtes/sync (_CapAtteint) ; galerie immeuble aussi mise en cache (`property:`). - Extraction structurée : tableau Suite Details (statut, pi², lits/sdb), Building Amenities, Rent Includes (-> inclusions), Pet Friendly (-> pets), contact, photos de l'unité, lat/lng de la liste. - Availability désormais remplie systématiquement depuis le statut du tableau (avant : regex fragile sur texte aplati, 1/8 vide). - Description extraite proprement du bloc

Description

(avant : fenêtre regex 40-600 caractères). ## Échantillon avant/après - Avant : « Tour du Parc — Montreal Studio (Bachelor) » — 1219 $, Studio, dispo « Disponible », 336 pi² (dérivé du texte), pets NULL, details `{"price_from": true}`, amenities [], pas de lat/lng. - Après : même annonce — 1219 $, Studio, « Disponible », 336 pi² (structuré du tableau), pets « oui », details `{"inclusions": {"heating": true, "electricity": true}, "elevator": true, "gym": true, "storage": true, "parking": {"available": true}, "contact": {"phone": "438-793-8796", "email": "leasing-1150sherbrooke@metcap.com"}, ...}`, 13 amenities, lat 45.5220, lng -73.5653. ## Lacunes génériques de normalisation observées - « On-Site Laundry Facilities » ne matche pas la règle laundry (motifs : buanderie|salle de lavage|laundry room) — « laundry facilities » manquant. - « Rooftop Terrace » (anglais) ne matche pas la règle balcony (motifs : balcon|terrasse|patio|loggia) — « terrace » manquant. - « Heat » / « Hydro » seuls (listes d'inclusions anglaises) ne matchent pas heating/electricity — contourné ici par des inclusions structurées car la source les expose dans une liste dédiée « Rent Includes ».