# logisbourg — Logisbourg - site: https://www.logisbourg.com/appartements-disponibles.asp - méthode: html - annonces: 10 → 10 - couverture après (sur 10 annonces): prix 100%, adresse 100%, dispo 100%, superficie 100%, commodités 100% - fixture: ok · test: ok ## Champs extraits - Liste (tableau ASP) : grandeur, date de dispo (attribut TITLE), étage, prix, inclusions (icônes ALT : chauffage, eau chaude, électricité, semi-meublé). - Fiche appartement.asp (mise en cache via `self.detail`, clé = hash de la ligne du tableau, plafond 80 vraies requêtes/sync) : - adresse complète AVEC no d'unité (`nomComplexeAdresse` : « 4855, 6e Avenue Ouest #403 ») — nouveau ; - lat/lng structurés (`google.maps.LatLng(...)`) — nouveau ; - superficie structurée (encadré `#superficie_encadre`) -> `area_sqft` explicite (plus fiable que le 1er « NNN pi » de la page) — nouveau ; - téléphone du bureau de location (lien `tel:` du formulaire de visite) -> `details.contact.phone` — nouveau ; - caractéristiques de l'appartement : ALT des icônes + texte visible (« Balcon 60 pi² », « Entrées laveuse/sécheuse incluses », « Un stationnement extérieur », « Revêtements : … ») ; - caractéristiques de l'immeuble (items `
  • ` : Bell Fibe, Intercom, service d'urgence 24/7…) en commodités + texte en description ; - description enrichie : paragraphe de présentation du complexe (`#DescriptionComplexe`) + caractéristiques immeuble + services optionnels (ex. « Stationnement extérieur au coût de 50$/mois » -> parking.price dérivé par finalize) — avant, seule la section « Caractéristiques immeuble » était captée ; - images (galerie de l'immeuble), comme avant. ## Champs indisponibles à la source - Animaux (aucune mention sur le site) -> `pets = None`. - Meublé : seul « semi-meublé » (poêle + réfrigérateur inclus) est exposé via l'icône ALT « Poêle et réfrigérateur inclus » ; pas d'unité meublée. - Pas d'API JSON ni de sitemap exploitable (site ASP old-school) ; pas de superficie sur la page liste (fiche seulement). ## Fragilités - HTML ASP non structuré : parsing par regex sur les classes de cellules (`Grandeur`, `DateDispo`, `Prix`…) — un changement de gabarit casserait le connecteur (le test fixture le détecterait). - Le serveur n'annonce pas de charset : l'UTF-8 est forcé (`_get_text`). - Adresses en exposants (`6e`) recousues par `_fix_sup`. - Clé de cache des fiches versionnée (`v3:`) : bump nécessaire si l'extraction de la fiche change, sinon les anciens payloads restent servis. ## Améliorations apportées - Fiches désormais servies par `self.detail()` (cache BD) : ~1 requête/sync en régime stable au lieu de 10 fetches systématiques ; plafond `max_details=80` compté DANS `fetch_fn` (les hits de cache ne comptent pas). - Nouveaux champs : lat/lng, `area_sqft` structuré, no d'unité dans l'adresse, `details.contact.phone`, revêtements, items immeuble en commodités, description 3 volets (complexe + immeuble + services optionnels). - Conservation des ALT d'icônes (« Entrées laveuse/sécheuse incluses ») en plus du texte visible : garde la détection `washer_dryer_hookup` de normalize. ## Échantillon avant/après - Avant : `4855, 6e Avenue Ouest — 4½ | 1215$ | dispo 2026-09-01 | 990 pi² (dérivé du texte) | pas de lat/lng | pas de contact | desc = caractéristiques immeuble seulement` - Après : `4855, 6e Avenue Ouest #403 — 4½ | 1215$ | dispo 2026-09-01 | 990 pi² (structuré) | lat 46.841064 / lng -71.264786 | contact 418-623-4006 | details : hookup laveuse-sécheuse, balcon, rangement, stationnement ext., étage 3 | desc = présentation du complexe + immeuble + services optionnels` ## Lacune générique de normalisation (à traiter dans normalize.py, pas ici) - « Entrée lave-vaisselle incluse » (le branchement, pas l'appareil) est classé `appliances.dishwasher = true` par `_AMENITY_RULES` — il faudrait une règle `dishwasher_hookup` analogue à `washer_dryer_hookup`. - « Entrées lave-vaisselle et laveuse/sécheuse inclus » (formulation combinée) n'est pas reconnu par le motif hookup `entrees? (?:de )?laveuse` — couvert ici uniquement parce que l'ALT séparé « Entrées laveuse/sécheuse incluses » est aussi émis.