From 325eff5ede5122d262fc766465eb7f692c11d55f Mon Sep 17 00:00:00 2001 From: sylvain Date: Sun, 8 Mar 2026 17:43:49 +0100 Subject: [PATCH] =?UTF-8?q?Matching=20s=C3=A9ries=E2=86=92site=20par=20dat?= =?UTF-8?q?es=20cibl=C3=A9es=20(CSS=20section-spectacle-dates-date)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - _get_performance_text_blocks : cible les éléments CSS spécifiques au site (section-spectacle-dates-date) plutôt que le texte brut de la page, évitant la contamination par le calendrier de navigation du site - match_series_to_catalog : remplace le matching LLM (trop imprécis avec les titres poétiques) par un recoupement de dates entre PDF et site - cluster_notes_into_series : passe les événements complets (avec dates) au lieu des notes seules → le LLM identifie correctement les répétitions partielles (ex: STRAUSS/PREVIN = même série que BEETHOVEN/STRAUSS/PREVIN) Résultat : Beethoven/Strauss/Previn→"Là où bat le cœur", Chostakovitch/Salonen/Prokofiev→"Virtuosité et destin", etc. Scraping réduit de 143 à 9 requêtes HTTP pour mars+avril. Co-Authored-By: Claude Sonnet 4.6 --- webapp/core.py | 223 +++++++++++++++++++++++++++++++------------------ 1 file changed, 143 insertions(+), 80 deletions(-) diff --git a/webapp/core.py b/webapp/core.py index 6a9499e..b36bb91 100644 --- a/webapp/core.py +++ b/webapp/core.py @@ -267,21 +267,40 @@ def _extract_description(soup: BeautifulSoup) -> str: return soup.get_text('\n', strip=True)[:2000] +def _get_performance_text_blocks(soup: BeautifulSoup) -> list[str]: + """ + Retourne les blocs de texte contenant les vraies dates de représentation. + Cible d'abord les éléments CSS spécifiques au site de l'opéra, + puis utilise le texte complet en fallback. + """ + # Balises ciblées sur le site opera-orchestre-montpellier.fr + for css_class in ['section-spectacle-dates-date', 'section-spectacle-dates', + 'event-dates', 'dates-seances', 'programme-dates']: + elements = soup.find_all(class_=css_class) + if elements: + return [el.get_text(' ', strip=True) for el in elements] + + # Fallback : balises