Sådan udtrækker du tekst fra OneNote‑filer i Python

Sådan udtrækker du tekst fra OneNote‑filer i Python

Microsoft OneNote .one filer er binære dokumenter, der ikke kan læses som almindelig tekst eller parses med generiske XML‑værktøjer. Aspose.Note FOSS for Python leverer en ren‑Python‑parser, der indlæser .one filer i en fuld dokumentobjektmodel (DOM), hvilket gør det enkelt at udtrække tekst, formateringsmetadata og hyperlinks programmatisk.

Fordele ved at bruge Aspose.Note FOSS til Python

  1. Ingen Microsoft Office påkrævet: læs .one‑filer på enhver platform, inklusive Linux CI/CD‑servere
  2. Fuld tekst‑ og formateringsadgang: ren tekst, fed/kurvet/understreget løb, skriftegenskaber og hyperlink‑URL’er
  3. Gratis og open‑source: MIT‑licens, ingen brugsgebyrer eller API‑nøgler

Trin-for-trin guide

Trin 1: Installer Aspose.Note FOSS for Python

Installer biblioteket fra PyPI. Kernepakken har ingen obligatoriske afhængigheder:

pip install aspose-note

Bekræft installationen:

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

Trin 2: Indlæs .one-filen

Opret en Document‑instans ved at videregive filstien:

from aspose.note import Document

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

For at indlæse fra en binær strøm (f.eks. fra cloud‑lagring eller et HTTP‑svar):

from aspose.note import Document

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

Trin 3: Udtræk al ren tekst

Brug GetChildNodes(RichText) til at indsamle hver RichText node i dokumenttræet. Dette udfører en rekursiv dybde‑først søgning på tværs af alle sider, oversigter og oversigtselementer:

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)

For at gemme al tekst i en fil:

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

Trin 4: Inspicer formaterede løb

Hver RichText node indeholder en TextRuns liste over TextRun segmenter. Hver tekstkørsel bærer en uafhængig TextStyle med per‑tegn formatering:

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

Trin 5: Udtræk hyperlinks

Hyperlinks gemmes på individuelle TextRun-noder. Tjek Style.IsHyperlink og læs 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}")

Trin 6: Udtræk tekst pr. side

For at udtrække tekst organiseret efter sidetitel:

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)

Almindelige problemer og løsninger

1. ImportError: Ingen modul med navnet ‘aspose’

Årsag: Pakken er ikke installeret i det aktive Python-miljø.

Rettelse:

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

2. FileNotFoundError ved indlæsning af .one-fil

Årsag: Filstien er forkert, eller filen findes ikke.

Fix: Brug en absolut sti eller bekræft, at filen findes, før den indlæses:

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 på Windows ved udskrivning

Årsag: Windows-terminaler kan bruge en ældre kodning, der ikke kan gengive Unicode-tegn.

Fix: Omkonfigurer stdout i starten af dit script:

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

4. Resultater af tom tekst

Årsag: Filen .one kan være tom, kun indeholde billeder eller tabeller (ingen RichText‑noder), eller være en notesbogfil (.onetoc2) i stedet for en sektionfil (.one).

Fix: Tjek sideantallet og inspicer nodetyper:

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

Årsag: Filen .one er krypteret. Krypterede dokumenter understøttes ikke.

Fix: Aspose.Note FOSS for Python understøtter ikke krypterede .one‑filer. Det fuldt udstyrede kommercielle Aspose.Note‑produkt understøtter dekryptering.


Ofte stillede spørgsmål

Kan jeg udtrække tekst fra alle sider på én gang?

Ja. doc.GetChildNodes(RichText) søger i hele dokumenttræet rekursivt, inklusive alle sider, oversigter og oversigtselementer.

Understøtter biblioteket .onetoc2-notebook-filer?

Nej. Biblioteket håndterer kun .one sektionfiler. Notebook‑indholdsfortegnelsesfiler (.onetoc2) er et andet format og understøttes ikke.

Kan jeg udtrække tekst fra tabeller?

Ja. TableCell noder indeholder RichText børn, der kan læses på samme måde:

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

Hvilke Python-versioner understøttes?

Python 3.10, 3.11 og 3.12.

Er biblioteket trådsikkert?

Hver Document-instans bør bruges fra en enkelt tråd. For parallel ekstraktion, opret en separat Document pr. tråd.


Relaterede ressourcer:

 Dansk