"""Extraction par règles : texte brut d'une page Facebook → champs du prospect.""" import re import unicodedata from datetime import date from departements import DEPARTEMENTS, departement_depuis_cp RE_TELEPHONE = re.compile(r"(?:\+33\s?[1-9]|0[1-9])(?:[\s.\-]?\d{2}){4}") RE_EMAIL = re.compile(r"[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}") RE_CP_VILLE = re.compile(r"(?= 0: segments = segments[:dernier_voie + 1] else: segments = [s for s in segments if s.lower() != "france"] return ", ".join(segments).strip(" ,-–") def _adresse(texte): lignes = [l.strip() for l in texte.split("\n")] # libellé « Adresse » de la section Coordonnées (mais pas « Adresse e-mail ») for i, ligne in enumerate(lignes): if ligne.lower() in ("adresse", "address"): for suite in lignes[i + 1:i + 3]: if suite and not re.match(r"^(adresse|address|e-?mail|téléphone|phone|site|web|messenger)", suite, re.I): return _nettoyer_adresse(suite) m = RE_ADRESSE.search(texte) return _nettoyer_adresse(m.group(1)) if m else "" def _ville_dept_parentheses(texte): """Repli quand il n'y a pas d'adresse postale : « Saint-Omer-de-Blain (44) ».""" for m in RE_VILLE_DEPT.finditer(texte): cle = m.group(2).upper() nom = DEPARTEMENTS.get(cle) if not nom: continue ville = (m.group(1) or "").strip("-'’ ") if len(ville) < 3 or ville.lower() in MOTS_INTERFACE or ville.lower() == "france": ville = "" return ville, f"{cle} - {nom}" return "", "" def _type_lieu(titre, texte): # La catégorie de la page apparaît en général dans les premiers caractères du texte for zone in (titre, texte[:500], texte): zone_norm = _sans_accents(zone.lower()) for mot, type_lieu in TYPES: if _chercher_mot(mot, zone_norm): return type_lieu return "" def _infos_lieu(texte): texte_norm = _sans_accents(texte.lower()) trouves = [mot for mot in INFOS_LIEU if _chercher_mot(mot, texte_norm)] return ", ".join(trouves[:5]) def extraire(titre, texte, url): cp, ville = _cp_ville(texte) departement = departement_depuis_cp(cp) if not cp: ville_repli, departement = _ville_dept_parentheses(texte) ville = ville or ville_repli return { "Nom du prospect": titre.strip(), "Département": departement, "Ville": ville, "Code Postal": cp, "Adresse": _adresse(texte), "Date d'ajout": date.today().strftime("%d/%m/%Y"), "Date de contact": "", "Nom de contact": "", "Téléphone": _telephone(texte), "Email": _email(texte), "Infos du lieu": _infos_lieu(texte), "Type": _type_lieu(titre, texte), "Lien Facebook": url, } if __name__ == "__main__": exemple = """Le Vieux Gréement Bar · Restaurant 12 Quai du Port, 29200 Brest, France 06 12 34 56 78 contact@vieuxgreement.fr Grande terrasse avec vue sur le port, concerts en plein air l'été dans le jardin. """ import json champs = extraire("Le Vieux Gréement", exemple, "https://www.facebook.com/vieuxgreement") print(json.dumps(champs, ensure_ascii=False, indent=2))