Skip to content
# 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
- 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:<path>).
- 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 ».