Extraire du texte à partir de fichiers OneNote en utilisant Python

Si vous devez lire du texte depuis Microsoft OneNote .one des fichiers dans un script Python, sans installer Microsoft Office ni exécuter Windows, Aspose.Note FOSS for Python est la solution. C’est une bibliothèque 100 % gratuite et open source qui analyse directement le format binaire OneNote et expose une API Python propre.

Installer

pip install aspose-note

Pas de clé API. Pas de fichier de licence. Pas de Microsoft Office.


L’approche la plus simple : GetChildNodes(RichText)

Le texte OneNote est stocké dans RichText des nœuds répartis sur les pages, les plans et les éléments de plan. GetChildNodes(RichText) effectue une recherche récursive de l’ensemble de l’arbre du document et renvoie chaque nœud de texte sous forme de liste plate :

from aspose.note import Document, RichText

doc = Document("MyNotes.one")
for rt in doc.GetChildNodes(RichText):
    if rt.Text:
        print(rt.Text)

C’est la façon la plus rapide d’extraire tout le contenu texte d’un .one fichier.


Enregistrer le texte dans un fichier

from aspose.note import Document, RichText

doc = Document("MyNotes.one")
lines = [rt.Text for rt in doc.GetChildNodes(RichText) if rt.Text]

with open("extracted.txt", "w", encoding="utf-8") as f:
    f.write("\n".join(lines))

print(f"Saved {len(lines)} text blocks to extracted.txt")

Extraire le texte par page

Lorsque vous devez savoir de quelle page provient chaque bloc de texte :

from aspose.note import Document, Page, RichText

doc = Document("MyNotes.one")
for page in doc.GetChildNodes(Page):
    title = (
        page.Title.TitleText.Text
        if page.Title and page.Title.TitleText
        else "(untitled)"
    )
    page_texts = [rt.Text for rt in page.GetChildNodes(RichText) if rt.Text]
    print(f"\n=== {title} ===")
    for text in page_texts:
        print(text)

Extraire les hyperliens

Les hyperliens sont stockés sur des TextRun objets au sein de RichText nœuds. Vérifiez run.Style.IsHyperlink:

from aspose.note import Document, RichText

doc = Document("MyNotes.one")
for rt in doc.GetChildNodes(RichText):
    for run in rt.Runs:
        if run.Style.IsHyperlink and run.Style.HyperlinkAddress:
            print(f"{run.Text!r}  ->  {run.Style.HyperlinkAddress}")

Détecter le formatage : gras, italique, souligné

Chaque TextRun transmet le formatage caractère par caractère à travers son TextStyle:

from aspose.note import Document, RichText

doc = Document("MyNotes.one")
for rt in doc.GetChildNodes(RichText):
    for run in rt.Runs:
        s = run.Style
        if any([s.Bold, s.Italic, s.Underline]):
            flags = ", ".join(f for f, v in [
                ("bold", s.Bold), ("italic", s.Italic), ("underline", s.Underline)
            ] if v)
            print(f"[{flags}] {run.Text.strip()!r}")

Lire depuis un flux

Fonctionne avec le stockage cloud, les corps de réponse HTTP ou les tampons en mémoire :

import io, urllib.request
from aspose.note import Document, RichText

##Example: load from bytes already in memory
one_bytes = open("MyNotes.one", "rb").read()
doc = Document(io.BytesIO(one_bytes))
texts = [rt.Text for rt in doc.GetChildNodes(RichText) if rt.Text]
print(f"Extracted {len(texts)} text block(s)")

Correction d’encodage Windows

Sur les terminaux Windows, sys.stdout peut utiliser un encodage hérité qui plante avec les caractères Unicode. Ajoutez ceci au début de votre script :

import sys
if hasattr(sys.stdout, "reconfigure"):
    sys.stdout.reconfigure(encoding="utf-8", errors="replace")

Ce que la bibliothèque prend en charge

FonctionnalitéPris en charge
Lire .one fichiers (chemin ou flux)Oui
Extraire RichText.Text (texte brut)Oui
Inspecter TextRun.Style (gras, italique, hyperlien, police)Oui
Extraire le texte des cellules de tableauOui
Lire les titres de pageOui
Écrire de nouveau dans .oneNon
Documents chiffrésNon

Étapes suivantes