Hoe tekst uit OneNote-bestanden te extraheren in Python

Hoe tekst uit OneNote-bestanden te extraheren in Python

Microsoft OneNote .one bestanden zijn binaire documenten die niet als platte tekst gelezen kunnen worden of geparseerd kunnen worden met generieke XML‑tools. Aspose.Note FOSS for Python biedt een pure‑Python parser die .one bestanden laadt in een volledig documentobjectmodel (DOM), waardoor het eenvoudig is om tekst, opmaakmetadata en hyperlinks programmatisch te extraheren.

Voordelen van het gebruik van Aspose.Note FOSS voor Python

  1. No Microsoft Office required: lees .one bestanden op elk platform, inclusief Linux CI/CD-servers
  2. Full text and formatting access: platte tekst, vet/cursief/onderstreept fragmenten, lettertype‑eigenschappen en hyperlink‑URL’s
  3. Free and open-source: MIT‑licentie, geen gebruikskosten of API‑sleutels

Stapsgewijze handleiding

Stap 1: Installeer Aspose.Note FOSS for Python

Installeer de bibliotheek vanaf PyPI. Het kernpakket heeft geen verplichte afhankelijkheden:

pip install aspose-note

Controleer de installatie:

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

Stap 2: Laad het .one‑bestand

Maak een Document-instantie door het bestandspad door te geven:

from aspose.note import Document

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

Om te laden vanuit een binaire stream (bijv. vanuit cloudopslag of een HTTP‑respons):

from aspose.note import Document

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

Stap 3: Alle platte tekst extraheren

Gebruik GetChildNodes(RichText) om elk RichText‑knooppunt in de documentboom te verzamelen. Dit voert een recursieve diepte‑eerste zoekopdracht uit over alle pagina’s, outlines en outline‑elementen:

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)

Om alle tekst op te slaan in een bestand:

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")

Stap 4: Inspecteer geformatteerde runs

Elke RichText knoop bevat een TextRuns lijst van TextRun segmenten. Elke run draagt een onafhankelijke TextStyle met per‑teken opmaak:

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}")

Stap 5: Hyperlinks extraheren

Hyperlinks worden opgeslagen op individuele TextRun knooppunten. Controleer Style.IsHyperlink en lees 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}")

Stap 6: Tekst per pagina extraheren

Om tekst te extraheren, georganiseerd per paginatitel:

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)

Veelvoorkomende problemen en oplossingen

1. ImportError: Geen module met de naam ‘aspose’

Oorzaak: Het pakket is niet geïnstalleerd in de actieve Python-omgeving.

Oplossing:

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

2. FileNotFoundError bij het laden van .one‑bestand

Oorzaak: Het bestandspad is onjuist of het bestand bestaat niet.

Oplossing: Gebruik een absoluut pad of controleer of het bestand bestaat voordat het wordt geladen:

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 op Windows bij het afdrukken

Oorzaak: Windows-terminals kunnen een verouderde codering gebruiken die Unicode‑tekens niet kan weergeven.

Oplossing: Configureer stdout opnieuw aan het begin van je script:

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

4. Lege tekstresultaten

Oorzaak: Het .one-bestand kan leeg zijn, alleen afbeeldingen of tabellen bevatten (geen RichText‑knooppunten), of een notitieboekbestand (.onetoc2) zijn in plaats van een sectiebestand (.one).

Fix: Controleer het aantal pagina’s en inspecteer knooptypen:

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

Oorzaak: Het .one-bestand is versleuteld. Versleutelde documenten worden niet ondersteund.

Fix: Aspose.Note FOSS voor Python ondersteunt geen versleutelde .one bestanden. Het volledig uitgeruste commerciële Aspose.Note‑product ondersteunt decryptie.


Veelgestelde vragen

Kan ik tekst van alle pagina’s in één keer extraheren?

Ja. doc.GetChildNodes(RichText) doorzoekt de volledige documentboom recursief, inclusief alle pagina’s, outlines en outline‑elementen.

Ondersteunt de bibliotheek .onetoc2 notebookbestanden?

Nee. De bibliotheek verwerkt alleen .one sectiebestanden. Notebook‑inhoudsopgavebestanden (.onetoc2) zijn een ander formaat en worden niet ondersteund.

Kan ik tekst uit tabellen extraheren?

Ja. TableCell knooppunten bevatten RichText kinderen die op dezelfde manier gelezen kunnen worden:

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()

Welke Python‑versies worden ondersteund?

Python 3.10, 3.11 en 3.12.

Is de bibliotheek thread-safe?

Elke Document-instantie moet vanuit één thread worden gebruikt. Voor parallelle extractie, maak een aparte Document per thread aan.


Gerelateerde bronnen:

 Nederlands