# picard — Groupe Picard Immobilier - site: https://picardimmobilier.net/recherche/ (fiches /logement//ref=/) - méthode: html - annonces: 34 → 34 - couverture après (sur 34 annonces): prix 100%, adresse 100%, dispo 100%, superficie 0%, commodités 100% - fixture: ok · test: ok ## Champs extraits - Cartes `/recherche/` : titre, secteur, adresse courte, prix ("$1055.00 Par mois"), type ("Chambres 1½"), photo. - Fiches : adresse complète (avec n° d'unité + code postal), disponibilité ("Disponible immédiatement", "Disponible en septembre 2026"), description, commodités (`div.col-6.text-dark` : "Wifi Illimité", "Emplacement : Étage 3", "Stationnement : Extérieur", "Climatisation", "Chat Accepté", "Meuble Incl. : Semi-Meublé"…), photos S3. - **lat/lng (nouveau)** : attributs `data-lat`/`data-lng` de la carte Google `#map-custom` — 34/34 géolocalisées. - Dérivés par finalize() : inclusions (chauffé/éclairé/wifi), balcon, stationnement, étage, furnished (semi-meublé → false), ac. ## Champs indisponibles à la source - Superficie : jamais affichée. - Date de disponibilité précise au jour près (seulement "immédiatement" ou "en "). ## Fragilités - Adresse et disponibilité extraites par regex sur le texte aplati de la fiche (pas de balises dédiées) — sensible à un changement de gabarit. - Le prix des cartes est au format US "$1055.00" ; parsing local conservé (parse_price gérerait aussi). - Colocations et commercial exclus par filtre sur le titre. ## Améliorations apportées - **Cache `self.detail(...)`** : les 34 fiches ne sont re-téléchargées que si la carte liste change (clé = sha1 de titre|prix|adresse|type|photo). Sync passe de ~26 s à ~0,4 s quand rien n'a changé ; plafond `max_details=80` vraies requêtes/sync (exception `_DetailBudget`, hits de cache non comptés). - Ajout lat/lng structurés (100%). - Parsing de fiche isolé dans `_parse_detail()` (payload JSON-sérialisable pour le cache). ## Échantillon avant/après - Avant : `Appartement | Limoilou | 1055 | 1½ | Disponible immédiatement | lat=None | details={"inclusions": {"internet": true}, "ac": true, ...}` - Après : idem + `lat=46.8406938, lng=-71.22826` ; description et commodités inchangées (déjà extraites) ; re-sync sans changement = 1 seule requête. ## Note de normalisation (générique) - "**Chat Accepté**" (singulier) ne matche ni `_PETS_COND_RE` ni `_PETS_YES_RE` (les motifs exigent "acceptes/admis" au pluriel après "chats?") → pets reste None sur les 34 annonces alors que la source l'affiche. Corriger les regex (accepter le singulier "accepte") dans normalize.py profiterait à toutes les sources.