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
- Kein Microsoft Office erforderlich:
.one‑Dateien auf jeder Plattform lesen, einschließlich Linux‑CI/CD‑Servern - Vollständiger Text- und Formatierungszugriff: Klartext, fett/kursiv/unterstrichen Lauf, Schriftarteigenschaften und Hyperlink‑URLs
- 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-noteInstallation ü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-note2. 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: