Hur man extraherar text från OneNote‑filer i Python

Hur man extraherar text från OneNote‑filer i Python

Microsoft OneNote .one-filer är binära dokument som inte kan läsas som vanlig text eller analyseras med generiska XML‑verktyg. Aspose.Note FOSS för Python tillhandahåller en ren‑Python‑parser som laddar .one-filer i en fullständig dokumentobjektmodell (DOM), vilket gör det enkelt att programmässigt extrahera text, formateringsmetadata och hyperlänkar.

Fördelar med att använda Aspose.Note FOSS för Python

  1. Ingen Microsoft Office krävs: läs .one-filer på vilken plattform som helst, inklusive Linux CI/CD-servrar
  2. Fullständig åtkomst till text och formatering: vanlig text, fet/kursiv/understruken körning, teckensnittsegenskaper och hyperlänk‑URL:er
  3. Fri och öppen källkod: MIT-licens, inga användningsavgifter eller API‑nycklar

Steg-för-steg-guide

Steg 1: Installera Aspose.Note FOSS för Python

Installera biblioteket från PyPI. Kärnpaketet har inga obligatoriska beroenden:

pip install aspose-note

Verifiera installationen:

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

Steg 2: Ladda .one-filen

Skapa en Document-instans genom att ange filvägen:

from aspose.note import Document

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

För att läsa in från en binär ström (t.ex. från molnlagring eller ett HTTP‑svar):

from aspose.note import Document

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

Steg 3: Extrahera all ren text

Använd GetChildNodes(RichText) för att samla in varje RichText‑nod i dokumentträdet. Detta utför en rekursiv djup‑först‑sökning över alla sidor, konturer och konturelement:

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)

För att spara all text till 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")

Steg 4: Inspektera formaterade körningar

Varje RichText nod innehåller en TextRuns lista med TextRun segment. Varje körning bär en oberoende TextStyle med formatering per tecken:

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

Steg 5: Extrahera hyperlänkar

Hyperlänkar lagras på individuella TextRun noder. Kontrollera Style.IsHyperlink och 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}")

Steg 6: Extrahera text per sida

För att extrahera text organiserad efter sidtitel:

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)

Vanliga problem och lösningar

1. ImportError: Ingen modul med namnet ‘aspose’

Orsak: Paketet är inte installerat i den aktiva Python‑miljön.

Rättelse:

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

2. FileNotFoundError vid inläsning av .one‑fil

Orsak: Filvägen är felaktig eller filen finns inte.

Fix: Använd en absolut sökväg eller verifiera att filen finns innan den laddas:

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 vid utskrift

Orsak: Windows-terminaler kan använda en äldre kodning som inte kan rendera Unicode-tecken.

Fix: Omkonfigurera stdout i början av ditt skript:

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

4. Resultat för tom text

Orsak: Filen .one kan vara tom, innehålla endast bilder eller tabeller (inga RichText‑noder), eller vara en anteckningsfil (.onetoc2) snarare än en sektionsfil (.one).

Fix: Kontrollera sidantalet och inspektera nodtyper:

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

Orsak: Filen .one är krypterad. Krypterade dokument stöds inte.

Fix: Aspose.Note FOSS för Python stöder inte krypterade .one‑filer. Den fullständigt utrustade kommersiella Aspose.Note‑produkten stöder dekryptering.


Vanliga frågor

Kan jag extrahera text från alla sidor på en gång?

Ja. doc.GetChildNodes(RichText) söker igenom hela dokumentträdet rekursivt, inklusive alla sidor, konturer och konturelement.

Stöder biblioteket .onetoc2‑anteckningsfiler?

Nej. Biblioteket hanterar endast .one sektionfiler. Notebookens innehållsförteckningsfiler (.onetoc2) är ett annat format och stöds inte.

Kan jag extrahera text från tabeller?

Ja. TableCell noder innehåller RichText barn som kan läsas på samma sätt:

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

Vilka Python-versioner stöds?

Python 3.10, 3.11 och 3.12.

Är biblioteket trådsäkert?

Varje Document-instans bör användas från en enda tråd. För parallell extraktion, skapa en separat Document per tråd.


Relaterade resurser:

 Svenska