# oklouer — OK Louer (appartements meublés temporaires, Québec) - site: https://www.oklouer.com/logements/ (haute-ville, centre-ville, limoilou, charlesbourg-beauport) + fiches d'unités - méthode: html - annonces: 41 → 41 - couverture après (sur 41 annonces): prix 100%, adresse 100%, dispo 0%, superficie 0%, commodités 100% - fixture: ok · test: ok ## Champs extraits - Adresse : `h3.unit-address` de la fiche (repli : `h3` de la carte de secteur) — plus robuste que l'ancienne regex sur le texte brut. - Prix : `div.price` de la fiche ("À partir de 75$/jour ou 1100$/mois") — prix mensuel extrait, `price_label` original conservé. - Type d'unité : `li.nb-pieces` du `ul.icon-list` (repli : slug de l'URL). - **lat/lng (nouveau)** : attributs `data-lat`/`data-lng` des cartes `div.unit` des pages de secteurs — 41/41 géolocalisées. - **Commodités (nouveau)** : icônes structurées `ul.icon-list` — nombre de lits (`ico-bed`), chambres (`ico-bedroom`), salles de bain (`ico-bathroom`), "Animaux permis" (`ico-paws`, tooltip), "Avec air climatisé sur demande" (`ico-clim`, tooltip) + "Meublé". → pets="oui" dérivé sur 23/41, ac dérivé, furnished=true. - Images : galerie `/uploads/m/` (inchangé). ## Champs indisponibles à la source - Disponibilité : jamais affichée (locations temporaires, disponibilité au téléphone). - Superficie : jamais affichée. - Description d'unité : la fiche ne contient qu'un texte boilerplate sur le quartier (identique pour toutes les unités du secteur) — non repris pour éviter de polluer les annonces. ## Fragilités - Le prix mensuel dépend du motif "…$/mois" dans `div.price` ; si le site n'affichait qu'un prix/jour (<100 $), price resterait None (comportement voulu, pas d'invention). - Les tooltips `title` des icônes sont en français et pourraient changer de libellé. - 41 fiches visitées à chaque sync (~28 s) — nécessaire car le prix n'apparaît que sur la fiche ; pas de signal de changement exploitable sur les cartes pour un cache `self.detail`. ## Améliorations apportées - Découverte par cartes structurées `div.logements div.unit` (au lieu d'une regex sur tous les hrefs) : adresse, lat/lng, icônes récupérés dès la liste. - Ajout lat/lng (100%), commodités par icônes (lits/chambres/sdb/animaux/clim), pets dérivé "oui" quand `ico-paws` présent. - `price_label` nettoyé (astérisque retiré, extrait de `div.price` plutôt que du texte complet de la page). - Adresse extraite de `h3.unit-address` (fini la regex fragile avec préfixe "2 1/2 dans Limoilou"). ## Échantillon avant/après - Avant : `2½ — 305 Rue Caron… | 1350 | 2½ | dispo="" | area=None | pets=None | details={"furnished": true, "price_from": true} | amenities=["Meublé"] | lat=None` - Après : `2½ — 305 Rue Caron… | 1350 | 2½ | dispo="" | area=None | details={"ac": true, "furnished": true, "price_from": true} | amenities=["1 lit","1 salle de bain","Avec air climatisé sur demande","Meublé"] | lat=46.8142, lng=-71.2294` ; unités avec `ico-paws` → pets="oui" (23/41). ## Note de normalisation (générique) - "Avec air climatisé **sur demande**" met `ac=true` via la règle `climatis` — `_NEUTRAL_RE` ne neutralise "sur demande" que pour les électroménagers, pas pour la climatisation.