# ----------------------------------------------------------------------------- # Lou-Ka — Agrégateur de logements à louer (province de Québec) # Auteur : Simon-Pierre Boucher — contact@spboucher.ai # connectors/alexcellence.py : connecteur Immeubles Alexcellence # (immeublesalexcellence.com) — apparts à Sherbrooke, secteurs Université de # Sherbrooke et Mont-Bellevue (clientèle étudiante). WordPress + thème # immobilier Houzez : 4e membre de la famille Houzez de l'Estrie — hérite de # DynamicConnector (lesgestionsdynamic.com) et n'en redéfinit que les # constantes et le crochet de disponibilité. Archive /appartements-a-louer/ # paginée (cartes item-listing-wrap v6 avec data-listid, data-images, # item-price « 1,010$/par mois »). Particularité locale : les étiquettes # label-status portent à la fois le statut (« À LOUER » / « LOUÉ ») et la # date de libération (« 1er août 2026 ») — les logements LOUÉ sont écartés, # la date devient la disponibilité. Fiches détail Houzez sans bloc adresse # structuré ni GPS : description + address.item-address seulement. # ----------------------------------------------------------------------------- from __future__ import annotations import re from .dynamic import DynamicConnector class AlexcellenceConnector(DynamicConnector): source_id = "alexcellence" request_delay = 0.7 max_pages = 6 max_details = 40 BASE = "https://immeublesalexcellence.com" LIST_PATH = "/appartements-a-louer/" CITY_DEFAULT = "Sherbrooke" def _card_availability(self, card, title: str) -> str: """Étiquettes label-status de la carte : « LOUÉ » fait écarter le logement (le parent filtre toute disponibilité contenant « loué ») ; sinon l'étiquette de date (« 1er août 2026 ») est la disponibilité.""" labels = [re.sub(r"\s+", " ", el.get_text(" ", strip=True)).strip() for el in card.select(".label-status")] labels = [l for l in labels if l] for label in labels: if re.search(r"\blou[ée]s?\b", label, re.I): return label # « LOUÉ » -> carte écartée for label in labels: if not re.fullmatch(r"[àa] louer", label, re.I): return label # date de libération return ""