Wie man Text aus OneNote-Dateien in Python extrahiert

Wie man Text aus OneNote-Dateien in Python extrahiert

Microsoft OneNote .one Dateien sind Binärdokumente, die nicht als Klartext gelesen oder mit generischen XML‑Tools geparst werden können. Aspose.Note FOSS for Python bietet einen reinen Python‑Parser, der .one Dateien in ein vollständiges Document Object Model (DOM) lädt und das programmgesteuerte Extrahieren von Text, Formatierungs‑Metadaten und Hyperlinks erleichtert.

Vorteile der Verwendung von Aspose.Note FOSS für Python

  1. Kein Microsoft Office erforderlich: .one‑Dateien auf jeder Plattform lesen, einschließlich Linux‑CI/CD‑Servern
  2. Vollständiger Text- und Formatierungszugriff: Klartext, fett/kursiv/unterstrichen Lauf, Schriftarteigenschaften und Hyperlink‑URLs
  3. Kostenlos und Open‑Source: MIT‑Lizenz, keine Nutzungsgebühren oder API‑Schlüssel

Schritt-für-Schritt-Anleitung

Schritt 1: Installieren Sie Aspose.Note FOSS für Python

Installieren Sie die Bibliothek von PyPI. Das Kernpaket hat keine zwingenden Abhängigkeiten:

pip install aspose-note

Installation überprüfen:

from aspose.note import Document
print("Installation OK")

Schritt 2: Laden Sie die .one‑Datei

Erstellen Sie eine Document‑Instanz, indem Sie den Dateipfad übergeben:

from aspose.note import Document

doc = Document("MyNotes.one")
print(f"Section: {doc.DisplayName}")
print(f"Pages:   {len(list(doc))}")

Um aus einem Binärstrom zu laden (z. B. aus Cloud‑Speicher oder einer HTTP‑Antwort):

from aspose.note import Document

with open("MyNotes.one", "rb") as f:
    doc = Document(f)

Schritt 3: Alle Klartexte extrahieren

Verwenden Sie GetChildNodes(RichText), um jeden RichText‑Knoten im Dokumentbaum zu sammeln. Dies führt eine rekursive Tiefensuche über alle Seiten, Gliederungen und Gliederungselemente durch:

from aspose.note import Document, RichText

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

for text in texts:
    print(text)

Um den gesamten Text in einer Datei zu speichern:

from aspose.note import Document, RichText

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

with open("extracted_text.txt", "w", encoding="utf-8") as out:
    out.write("\n".join(texts))

print(f"Wrote {len(texts)} text blocks to extracted_text.txt")

Schritt 4: Formatierte Läufe prüfen

Jeder RichText‑Knoten enthält eine TextRuns‑Liste von TextRun‑Segmenten. Jeder Lauf trägt ein unabhängiges TextStyle mit pro‑Zeichen‑Formatierung:

from aspose.note import Document, RichText

doc = Document("MyNotes.one")

for rt in doc.GetChildNodes(RichText):
    for run in rt.TextRuns:
        style = run.Style
        attrs = []
        if style.IsBold:        attrs.append("bold")
        if style.IsItalic:      attrs.append("italic")
        if style.IsUnderline:   attrs.append("underline")
        if style.IsStrikethrough: attrs.append("strikethrough")
        if style.FontName:    attrs.append(f"font={style.FontName}")
        if style.FontSize:    attrs.append(f"size={style.FontSize}pt")
        label = ", ".join(attrs) if attrs else "plain"
        print(f"[{label}] {run.Text!r}")

Schritt 5: Hyperlinks extrahieren

Hyperlinks werden in einzelnen TextRun‑Knoten gespeichert. Überprüfen Sie Style.IsHyperlink und lesen Sie Style.HyperlinkAddress:

from aspose.note import Document, RichText

doc = Document("MyNotes.one")

for rt in doc.GetChildNodes(RichText):
    for run in rt.TextRuns:
        if run.Style.IsHyperlink and run.Style.HyperlinkAddress:
            print(f"Link text: {run.Text!r}")
            print(f"URL:       {run.Style.HyperlinkAddress}")

Schritt 6: Text pro Seite extrahieren

Um Text nach Seitentitel organisiert zu extrahieren:

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)"
    )
    print(f"\n=== {title} ===")
    for rt in page.GetChildNodes(RichText):
        if rt.Text:
            print(rt.Text)

Häufige Probleme und Lösungen

1. ImportError: No module named ‘aspose’

Ursache: Das Paket ist nicht in der aktiven Python‑Umgebung installiert.

Korrektur:

pip install aspose-note
##Confirm active environment:
pip show aspose-note

2. FileNotFoundError beim Laden der .one-Datei

Ursache: Der Dateipfad ist falsch oder die Datei existiert nicht.

Fix: Verwenden Sie einen absoluten Pfad oder überprüfen Sie, ob die Datei vor dem Laden existiert:

from pathlib import Path
from aspose.note import Document

path = Path("MyNotes.one")
if not path.exists():
    raise FileNotFoundError(f"File not found: {path.resolve()}")
doc = Document(str(path))

3. UnicodeEncodeError unter Windows beim Drucken

Ursache: Windows-Terminals können eine veraltete Codierung verwenden, die Unicode‑Zeichen nicht rendern kann.

Fix: Konfigurieren Sie stdout zu Beginn Ihres Skripts neu:

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

4. Leere Textresultate

Ursache: Die .one Datei kann leer sein, nur Bilder oder Tabellen enthalten (keine RichText‑Knoten) oder eine Notizbuchdatei (.onetoc2) statt einer Abschnittsdatei (.one) sein.

Fix: Überprüfen Sie die Seitenzahl und untersuchen Sie die Knotentypen:

from aspose.note import Document

doc = Document("MyNotes.one")
print(f"Pages: {len(list(doc))}")
for page in doc:
    print(f"  Children: {sum(1 for _ in page)}")

5. IncorrectPasswordException

Ursache: Die .one-Datei ist verschlüsselt. Verschlüsselte Dokumente werden nicht unterstützt.

Fix: Aspose.Note FOSS für Python unterstützt keine verschlüsselten .one-Dateien. Das voll funktionsfähige kommerzielle Aspose.Note-Produkt unterstützt die Entschlüsselung.


Häufig gestellte Fragen

Kann ich Text aus allen Seiten auf einmal extrahieren?

Ja. doc.GetChildNodes(RichText) durchsucht den gesamten Dokumentbaum rekursiv, einschließlich aller Seiten, Gliederungen und Gliederungselemente.

Unterstützt die Bibliothek .onetoc2‑Notizbuchdateien?

Nein. Die Bibliothek verarbeitet nur .one Abschnittsdateien. Notebook‑Inhaltsverzeichnisdateien (.onetoc2) sind ein anderes Format und werden nicht unterstützt.

Kann ich Text aus Tabellen extrahieren?

Ja. TableCell-Knoten enthalten RichText-Kinder, die auf dieselbe Weise gelesen werden können:

from aspose.note import Document, Table, TableRow, TableCell, RichText

doc = Document("MyNotes.one")
for table in doc.GetChildNodes(Table):
    for row in table.GetChildNodes(TableRow):
        for cell in row.GetChildNodes(TableCell):
            cell_text = " ".join(rt.Text for rt in cell.GetChildNodes(RichText)).strip()
            print(cell_text, end="\t")
        print()

Welche Python-Versionen werden unterstützt?

Python 3.10, 3.11 und 3.12.

Ist die Bibliothek thread-safe?

Jede Document‑Instanz sollte von einem einzelnen Thread verwendet werden. Für parallele Extraktion erstellen Sie pro Thread eine separate Document.


Verwandte Ressourcen:

 Deutsch