SPB Git

spb/lou-ka Public

Lou·Ka — tous les logements à louer du Québec, un seul endroit.

HTML 99.7%
4.0 KB

# logisma — Logisma Gestion Immobilière

  • site: https://logisma.ca/appartements-a-louer/
  • méthode: html
  • annonces: 18 → 18
  • couverture après (sur 18 annonces): prix 100%, adresse 100%, dispo 94%, superficie 0%, commodités 94%
  • fixture: ok · test: ok

# Champs extraits

  • Cartes de la page de recherche (comme avant) : type d'unité, ville/secteur (filtre Québec/Lévis), adresse, prix.
  • Pages détail — désormais via self.detail() (cache BD, clé = hash de la carte versionné v3:, plafond 60 vraies requêtes/sync) :
    • disponibilité (« Disponible le 1er août 2026 ») ;
    • liste « Détails : » extraite STRUCTURELLEMENT (items <li> du widget Elementor) avec repli sur les puces « • » — corrige 4 annonces qui n'avaient AUCUNE commodité (pages sans puces) ; queue « **Les photos… » coupée du dernier item ;
    • description : paragraphes de la section « Description » (au lieu du og:description fourre-tout) + promotion (« UN MOIS GRATUIT réparti sur 11 mois. Prix régulier 967$/mois. ») préfixée « Promotion : » ;
    • téléphone du bureau (lien tel:) -> details.contact.phone — nouveau ;
    • images (uploads WP, bruit filtré), prix de secours si absent de la carte.
  • Dérivés par finalize() : pets (« Animaux refusés… »), fumeur, inclusions, stationnement, borne de recharge en texte.

# Champs indisponibles à la source

  • SUPERFICIE : jamais publiée (ni carte, ni fiche, ni API) -> area_sqft = None partout (0 %) — c'est un manque de la source, pas du connecteur.
  • lat/lng : aucune carte/coordonnées sur les fiches.
  • L'API REST WordPress (/wp-json/wp/v2/location, 19 posts) a été auditée : content vide et acf: [] -> rien de plus que le HTML.

# Fragilités

  • 1 annonce (« 3 1/2 – 599, avenue de Norvège #12 ») a un lien de fiche MORT à la source : logisma.ca redirige vers la page liste. Garde ajouté (si l'URL finale diffère de l'URL demandée, on garde les données de la carte) -> cette annonce reste sans dispo/commodités (d'où les 94 %).
  • Contenu Elementor très variable d'une fiche à l'autre (avec/sans puces, spans de styles inline) : double stratégie <li> structurel + repli puces.
  • Clé de cache versionnée (v3:) : à bumper si l'extraction des fiches change.

# Améliorations apportées

  • Cache BD des fiches (self.detail) : ~1 requête/sync en régime stable au lieu de 18 fetches systématiques ; budget compté dans fetch_fn.
  • Commodités : 14/18 -> 17/18 annonces couvertes (extraction <li>).
  • Description propre (texte réel de la section) + promotions.
  • details.contact.phone structuré (lien tel:).
  • Garde anti-redirection (liens morts).

# Échantillon avant/après

  • Avant : 2 1/2 – 89 Place de Versailles #02, Lévis | 920$ | dispo 2026-08-01 | amenities [] | details {} | description = og:description fourre-tout
  • Après : 2 1/2 – 89 Place de Versailles #02, Lévis | 920$ | dispo 2026-08-01 | amenities [Eau chaude INCLUSE!, 1 stationnement extérieur inclus, Borne de recharge($), Buanderie($), Non chauffé non éclairé, Animaux refusés (sauf un chat), Enquête de crédit] | details {hot_water:true, heating:false, electricity:false, laundry, parking ext. inclus, pets:non, contact 418-652-0377} | description = vraie section Description

# Lacunes génériques de normalisation (à traiter dans normalize.py, pas ici)

  • « Non-chauffé, non-éclairé » AVEC TRAITS D'UNION : les motifs négatifs (non chauffe, non eclaire) exigent une espace -> non reconnus, et pire, le positif eclaire\b matche à l'intérieur de « non-eclaire » -> electricity: true erroné (vu sur « 5 1/2 – 305 rue Laroche #7 »).
  • « Animaux refusés (à l'exception d'un chat) » / « (sauf un chat) » est classé pets: "non" alors que « conditions » (chat accepté) serait plus juste — _PETS_COND_RE ne couvre pas la tournure « à l'exception de / sauf ».
  • « Buanderie dans l'immeuble($) » (payante) donne laundry: true sans nuance.