spb/lou-ka Public
Lou·Ka — tous les logements à louer du Québec, un seul endroit.
HTML 99.7%
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