Skip to content

web_read

Lecture d'une page web : texte principal, titre et dates déclarées.

21 septembre 2026 : « Qui est le premier ministre du Canada ? » — web_search rendait cinq extraits (brave, région ca-fr) dont AUCUN ne disait qui est le titulaire : des bouts pris au hasard dans les pages Wikipédia « Premier ministre du Canada », « Mark Carney », « Justin Trudeau », « Liste des Premiers ministres ». Le 9b a répondu « Justin Trudeau [3] ». Le corps de fr.wikipedia.org/wiki/Premier_ministre_du_Canada, lui, porte dans l'infobox la ligne « Titulaire actuel | Mark Carney | depuis le 14 mars 2025 » et dans le premier vrai paragraphe « Mark Carney, le premier ministre actuel, a prêté serment le 14 mars 2025, après la démission de Justin Trudeau ».

Le mode « URL dans la requête » de web_search (WebSearchTool._fetch_url) ne pouvait pas le lire : un <[^>]+> sur tout le HTML rend 6 000 caractères de menu et de bandeau cookies, jamais le corps. D'où cet outil : la zone principale une fois le bruit retiré, les blocs en ordre de document, les lignes de tableau jointes par « | » (text_content() collait « Titulaire actuelMark Carneydepuis le 14 mars 2025 »), et les dates prises là où la page les déclare — jamais devinées (§5 du cahier : une date que la page ne porte pas n'existe pas).

Revue du 21 septembre au soir, contre des pages réelles et des pages piégées : le bruit était retiré sans regarder s'il ENGLOBAIT le contenu (body.has-sidebar de WordPress, le <form> unique d'ASP.NET) et la page revenait vide, en succès ; <header> était du bruit même dans un <article>, et le patron HTML5 le plus courant perdait son titre et sa date ; une bombe gzip matérialisait 67 Mo d'un seul morceau ; un serveur qui goutte était lu 50 s dans un fil que l'exécuteur avait abandonné. Chaque correction porte sa date dans le code.

Classes

Page dataclass

Page(
    url: str,
    titre: str,
    publie: str,
    modifie: str,
    texte: str,
)

Ce qu'une page déclare : dates en AAAA-MM-JJ ou "", texte une ligne par bloc.

PageIllisible

Bases: ValueError

Le HTML ne peut pas être lu en entier ; le message se rend tel quel.

WebReadTool

Bases: BaseTool

Read one web page: main text, title and dates it declares.

Functions:

date_iso

date_iso(brute: str) -> str

AAAA-MM-JJ, ou "" pour tout ce qui n'est pas une date sans ambiguïté.

« 06/17/2016 - 20:07 » (pm.gc.ca, 21/09) est refusé : on ne sait pas si c'est juin ou le 17e mois. La date d'un instant horodaté est gardée telle que déclarée, sans passer au fuseau du poste : c'est ce que la page dit.

Source code in src/diapason/tools/web_read.py
def date_iso(brute: str) -> str:
    """AAAA-MM-JJ, ou "" pour tout ce qui n'est pas une date sans ambiguïté.

    « 06/17/2016 - 20:07 » (pm.gc.ca, 21/09) est refusé : on ne sait pas si
    c'est juin ou le 17e mois. La date d'un instant horodaté est gardée telle
    que déclarée, sans passer au fuseau du poste : c'est ce que la page dit.
    """
    texte = " ".join(str(brute or "").split())
    if not texte:
        return ""
    m = _ISO.match(texte)
    if m:
        return _jour_valide(int(m.group(1)), int(m.group(2)), int(m.group(3)))
    plat = _aplatir(texte)
    # « mar » est mardi ET March : on essaie d'abord la chaîne entière, et
    # seulement ensuite sans son premier mot s'il est un jour de semaine.
    candidats = [plat]
    premier, _, reste = plat.partition(" ")
    if reste and premier.rstrip(",.") in _JOURS_SEMAINE:
        candidats.append(reste)
    for candidat in candidats:
        m = _JOUR_MOIS_AN.match(candidat)
        if m and m.group(2) in _MOIS:
            return _jour_valide(int(m.group(3)), _MOIS[m.group(2)], int(m.group(1)))
        m = _MOIS_JOUR_AN.match(candidat)
        if m and m.group(1) in _MOIS:
            return _jour_valide(int(m.group(3)), _MOIS[m.group(1)], int(m.group(2)))
    if _RFC2822.match(texte):
        try:
            return parsedate_to_datetime(texte).date().isoformat()
        except (TypeError, ValueError):
            return ""
    return ""

zone_principale

zone_principale(doc: Any) -> Any

L'élément qui porte le corps de la page, débarrassé du bruit.

Travaille sur une COPIE du document : retirer les