# urban_services — Urban Services (Urban Tenant Solutions) - site: https://rent.urbanservices.ca/Listing/Listings (vitrine : https://urbanservices.ca) - méthode: html + JSON embarqué (portail Building Stack) - annonces: 53 (unités disponibles, 16 immeubles — Gatineau seulement) - couverture (sur 53 annonces): prix 100%, adresse 100%, dispo 98%, superficie 74%, commodités 70%, images 100%, GPS 100% - fixture: ok · test: ok ## Champs extraits - Portail **Building Stack** — même famille que le volet edifialocation.com du connecteur edifia.py, sélecteurs identiques : - `/Listing/Listings` embarque `var units = [...]` (une entrée par appartement annoncé : prix structuré + `PriceFormatted`, pi², chambres/sdb, adresse complète avec code postal, **GPS**, contact de l'immeuble (`ListingEmployeesContacts` -> `details.contact` nom/téléphone/courriel), photo d'unité et d'immeuble) ; - pages immeuble `/b/` (16 requêtes/sync, garde-fou `max_buildings=40`) : onglets `a.apartment-view-potential` = **inventaire complet** (numéro, prix, pi², chambres, sdb, date de disponibilité : « Disponible dès maintenant! », « oct. 01, 2027 » -> « Libre oct. 01, 2027 ») + commodités `.facilities` (« Ascenseur », « Stationnement intérieur »). - **La page /b/ fait foi pour l'inventaire** : le JSON de la liste est tronqué pour les immeubles à fort inventaire (ex. 19-21 Patrimoine : 8 entrées JSON pour 30 unités affichées sur /b/…). Le connecteur croise les deux : onglets = lignes, JSON = enrichissement (GPS, contact, prix structuré, photo, URL profonde `/b//`). - Filtre provincial : `Address.Province.ProvinceCode == QC` (11 unités d'Ottawa exclues). - `unit_type` : convention Building Stack (comme edifia) — 0 chambre -> Studio, n chambres -> (n+2)½. - `external_id` = `-` — stable. - Le JSON Razor encode les apostrophes (`'`) : `html.unescape` sur adresse/ville/nom d'immeuble. ## Champs indisponibles à la source - Description : le portail n'a pas de texte descriptif par immeuble/unité (champ synthétique pi²/chambres/sdb seulement). - Commodités : absentes pour 5/16 immeubles (`.facilities` vide). - Superficie : « -- » pour 14/53 unités. - Disponibilité : 1 unité présente dans le JSON mais absente des onglets -> dispo laissée vide (jamais inventée). ## Fragilités - Sélecteurs Building Stack (`var units = `, `ul.wpb-tabs-menu a.apartment-view-potential`, `.facilities`) : partagés avec edifia — toute casse touchera les deux (et inversement, un correctif servira aux deux). - Position des `span` dans les onglets (0=unité, 1=prix, 2=pi², 3=chambres, 4=sdb, 5=dispo) : implicite, comme edifia. - Les unités « 0 chambre / 0 sdb / -- pi² » (ex. 202-204 St-Rédempteur à 700 $) sont typées Studio par la convention Building Stack — possiblement des chambres. ## Notes - 53 unités disponibles (700 $–4 800 $) dans 16 immeubles, toutes à Gatineau (secteurs Hull, Aylmer, Plateau…) ; certaines dispos lointaines (2027-2028) publiées par la source et conservées telles quelles. - robots.txt de rent.urbanservices.ca : vide (aucune interdiction). - Premier connecteur « portail Building Stack pur » hors edifia — patron réutilisable (Gestion Summum, etc.).