# plan_a — Plan A Immobilier - site: https://plan-a.ca/plan-a-appartements-et-condos-a-louer/ (fiches /project//) - méthode: html - annonces: 9 → 9 (granularité = 1 annonce par complexe, prix plancher ; projets Saguenay/Sherbrooke exclus) - couverture après (sur 9 annonces): prix 100%, adresse 100%, dispo 100%, superficie 0%, commodités 100% - fixture: ok · test: ok ## Champs extraits - Cartes-projets : JSON `data-filters-item` (ville, budget-min), adresse, prix "À partir de", types, disponibilité, carrousel d'images (inchangé). - Fiches projets : - **Commodités des unités (nouveau)** : section `.c-feature` ("Comptoir de quartz", "Électroménagers (5) inclus", "Thermopompe murale", "Balcon privé", "Un animal de 10 livres et moins est permis"…). - **Services de l'immeuble (nouveau)** : liste à puces sous "SERVICES DANS L'IMMEUBLE" ("Ascenseurs", "Stationnements intérieurs ($)", "Espaces de rangements ($)"…). - **Atouts (nouveau)** : titres du carrousel `.c-cell_title h4` ("Centre fitness", "Piscine"…). - Types d'unités complets (`.c-info_unit` : 3½/4½/5½), description (og:description), disponibilité "Prochaine disponibilité + x/y unités", quartier (section QUARTIER). - **Galerie (nouveau)** : photos wp-content de la fiche ajoutées aux images de la carte (cap 20). - Dérivés par finalize() : ascenseur, balcon, piscine, gym, rangement, ac (thermopompe), stationnement intérieur/extérieur, lave-vaisselle, entrée laveuse-sécheuse, price_from. ## Champs indisponibles à la source - Superficie : non affichée (ni par projet ni par type). - Prix/dispo par unité : la page publique n'expose que le prix plancher et le compte d'unités disponibles ; pas d'API des unités individuelles (vérifié : pas de wp-json custom, pas d'iframe de disponibilités). - lat/lng : non exposés (seulement un lien google.com/maps?q=). - pets structuré : seulement en texte libre ("Un animal de 10 livres et moins est permis"). ## Fragilités - Disponibilité extraite par regex sur le texte aplati ("Prochaine disponibilité … Unités"). - Thème sur mesure (classes c-card/c-feature/c-cell) — refonte graphique = maintenance. - La liste des sous-titres de carte sert à la fois d'adresse et de prix (ordre positionnel). ## Améliorations apportées - **Cache `self.detail(...)`** : les 9 fiches projets ne sont re-téléchargées que si la carte change (clé = sha1 de prix|dispo|types|adresse) ; sync sans changement : 25 s → 2,4 s ; plafond `max_details=20` vraies requêtes (compteur dans fetch_fn). - Commodités : de 0% à 100% (3 sections extraites), d'où des details riches (avant : quasi vides). - Types d'unités complets depuis la fiche, galerie enrichie. - 2026-08-08 — Expansion provinciale (lot 0) : `sherbrooke` ajouté à `ALLOWED_CITIES`. +1 annonce : Complexe du Parc (85 Rue Bowen N, Sherbrooke — 1½ à 4½, à partir de 590 $/mois, 29/196 unités disponibles). Saguenay (District Jonquière, disponible sur le site) reste exclu — prévu au lot Est & Nord du plan d'expansion. 9 → 10 annonces. Fixture réenregistrée, 2 tests verts. ## Échantillon avant/après - Avant : `ELORA | 1720 | 3½ | Disponible maintenant (79 / 185 unités) | amenities=[] | details={"price_from": true}` - Après : `ELORA | 1720 | 3½ | Disponible maintenant (79 / 185 unités) | amenities=["Comptoir de quartz et dosseret de quartz", "Électroménagers (5) inclus dans toutes les unités", …, "Ascenseurs", "Stationnements intérieurs ($)"] | details={"appliances": {"fridge": true}, "ac": true, "elevator": true, "balcony": true, "gym": true, "storage": true, "parking": {"available": true, "type": "intérieur"}, "price_from": true}` ## Notes de normalisation (génériques) - "**Un animal de 10 livres et moins est permis**" (singulier "animal") ne matche aucun motif pets (`_PETS_*_RE` n'acceptent que "animaux/chats/chiens") → pets=None alors que la source l'affiche. Ajouter le singulier "animal … permis" profiterait à toutes les sources. - `unit_type` du schéma est mono-valeur : "3½, 4½, 5½" est réduit à "3½" par normalize_unit_type — cohérent avec le prix plancher, mais l'éventail des types du complexe est perdu (visible seulement dans la fixture/le titre).