# -----------------------------------------------------------------------------
# Lou-Ka — Agrégateur de logements à louer (province de Québec)
# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
# connectors/lok36.py : connecteur LOK 36 (lok36.com)
# Immeuble locatif au 36, boulevard de la Seigneurie Ouest, Blainville
# (60 unités, 3½ à 5½). WordPress rendu serveur : la page /prix-plans/
# contient une image cliquable dont chaque unité a un tooltip
#
")[0] # fin du tooltip
text = re.sub(r"\s+", " ", re.sub(r"<[^>]+>", " ", body))
fields = {k: (m.group(1).strip() if (m := rx.search(text)) else "")
for k, rx in FIELD_RE.items()}
num = fields["num"]
if not num or num in seen:
continue
seen.add(num)
if re.search(r"lou[ée]", fields["status"], re.I):
continue # LOUÉ
unit_type = normalize_unit_type(fields["typo"])
price = None
price_label = ""
if fields["price"]:
try:
v = float(fields["price"].replace(" ", "")
.replace(" ", "").replace(",", ""))
if 300 <= v <= 20000:
price = v
price_label = f"{int(v)}$/mois"
except ValueError:
pass
area = None
if fields["area"]:
try:
v = float(fields["area"].replace(" ", "").replace(" ", ""))
if 100 <= v <= 10000:
area = v
except ValueError:
pass
details: dict = {}
m = PDF_RE.search(body)
if m:
details["floor_plan"] = m.group(1)
desc_bits = [f"Unité {num}",
f"Modèle {fields['model']}" if fields["model"] else ""]
listings.append(Listing(
source=self.source_id,
external_id=num,
url=PLANS_URL,
title=f"LOK 36 — Unité {num}",
address=ADDRESS,
city=CITY,
unit_type=unit_type,
price=price,
price_label=price_label,
availability=fields["status"] or "Disponible",
area_sqft=area,
description=" — ".join(b for b in desc_bits if b),
details=details,
images=list(images),
))
return listings