# 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.