SPB Git

spb/lou-ka Public

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

HTML 99.7%
3.4 KB · 78 lines python
Raw Blame History
1# -----------------------------------------------------------------------------2# Lou-Ka — Agrégateur de logements à louer (province de Québec)3# Auteur : Simon-Pierre Boucher — contact@spboucher.ai4# connectors/le_st_georges.py : connecteur Le St-Georges (lestgeorges.ca)5#   11 295, 1re Avenue, Saint-Georges (Beauce, Chaudière-Appalaches) —6#   56 unités locatives sur 7 étages habités (3½ à 5½).7#   Même plateforme WordPress « do-selecteur-plans » que La Cour Appartements8#   et AULA Lévis : sélecteur SVG d'unités (polygones data-nom / data-etage /9#   data-type / data-prix, classes disponible / indisponible « Loué ») + REST10#   /wp-json/do-selecteur-plans/v1/unite (montant, superficies habitable et11#   balcon, plan PDF, libellé « Libre le … »). Tout le parsing et le cache BD12#   sont hérités de LaCourConnector ; seules changent les constantes du projet13#   et deux particularités du thème :14#     - le sélecteur est sur la PAGE D'ACCUEIL (PLANS_PATH vide) ;15#     - les photos du projet sont des PNG (le motif partagé ne retient que16#       jpg/webp) et les commodités sont des blocs `.sc_icons_item_title`17#       -> _site_images() et _project_amenities() sont redéfinies.18#   Les unités louées sont exclues (classe « indisponible », état REST).19# -----------------------------------------------------------------------------20from __future__ import annotations2122import re2324from bs4 import BeautifulSoup2526from .la_cour import LaCourConnector2728_IMG_RE = re.compile(29    r'https?://[^"\'\s\)]+/wp-content/uploads/[^"\'\s\)]+'30    r'\.(?:jpg|jpeg|png|webp)', re.I)31_SKIP_IMG = re.compile(32    r"logo|\blog[_-]|icon|favicon|badge|plan|selecteur"33    r"|-\d{2,4}x\d{2,4}\.", re.I)343536class LeStGeorgesConnector(LaCourConnector):37    source_id = "le_st_georges"3839    BASE = "https://lestgeorges.ca"40    PLANS_PATH = ""              # le sélecteur d'unités est sur l'accueil41    NAME = "Le St-Georges"42    ADDRESS = "11 295, 1re Avenue, Saint-Georges, QC G5Y 2C2"43    SECTOR = "Centre-ville"44    CITY = "Saint-Georges"45    PHOTO_PAGES = ("",)          # photos publiées sur l'accueil46    AMENITY_PAGES = ("",)4748    # -- particularités du thème -----------------------------------------------49    def _site_images(self) -> list[str]:50        """Photos du projet : uploads jpg/png/webp de l'accueil (le thème51        publie des PNG), hors logos, badges et plans d'unités."""52        imgs: list[str] = []53        for page in self.PHOTO_PAGES:54            try:55                html = self.get(f"{self.BASE}/{page}").text56            except Exception:57                continue58            for u in dict.fromkeys(_IMG_RE.findall(html)):59                if not _SKIP_IMG.search(u) and u not in imgs:60                    imgs.append(u)61        return imgs[: self.max_images]6263    def _project_amenities(self) -> list[str]:64        """Commodités de l'immeuble : titres des blocs « Nos espaces, votre65        confort » (`.sc_icons_item_title`) de l'accueil."""66        items: list[str] = []67        for page in self.AMENITY_PAGES:68            try:69                html = self.get(f"{self.BASE}/{page}").text70            except Exception:71                continue72            soup = BeautifulSoup(html, "html.parser")73            for el in soup.select(".sc_icons_item_title"):74                t = re.sub(r"\s+", " ", el.get_text(" ", strip=True)).strip()75                if 3 <= len(t) <= 90 and t not in items:76                    items.append(t)77        return items[:30]78