Kako izvući tekst iz OneNote datoteka u Pythonu

Kako izvući tekst iz OneNote datoteka u Pythonu

Microsoft OneNote .one datoteke su binarni dokumenti koji se ne mogu čitati kao običan tekst niti parsirati generičkim XML alatima. Aspose.Note FOSS for Python pruža čisti Python parser koji učitava .one datoteke u potpuni model objektnog dokumenta (DOM), što olakšava programatsko izdvajanje teksta, metapodataka formatiranja i hiperveza.

Prednosti korištenja Aspose.Note FOSS za Python

  1. Nije potreban Microsoft Office: čitajte .one datoteke na bilo kojoj platformi, uključujući Linux CI/CD poslužitelje
  2. Potpuni pristup tekstu i formatiranju: običan tekst, podebljane/kurzivne/podvučene sekvence, svojstva fonta i URL‑ovi hiperveza
  3. Besplatan i otvorenog koda: MIT licenca, bez naknada za korištenje ili API ključeva

Vodič korak po korak

Korak 1: Instalirajte Aspose.Note FOSS za Python

Instalirajte biblioteku s PyPI-a. Jezgra paketa nema obaveznih ovisnosti:

pip install aspose-note

Provjerite instalaciju:

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

Korak 2: Učitaj .one datoteku

Stvorite Document instancu prosljeđivanjem putanje datoteke:

from aspose.note import Document

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

Za učitavanje iz binarnog toka (npr. iz cloud pohrane ili HTTP odgovora):

from aspose.note import Document

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

Korak 3: Izdvoji sav običan tekst

Koristite GetChildNodes(RichText) za prikupljanje svakog RichText čvora u stablu dokumenta. Ovo izvodi rekurzivno pretraživanje po dubini kroz sve stranice, konture i elemente konture:

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)

Za spremanje cijelog teksta u datoteku:

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

Korak 4: Pregledajte formatirane sekvence

Svaki RichText čvor sadrži TextRuns popis TextRun segmenata. Svaki niz nosi neovisni TextStyle s formatiranjem po znaku:

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

Korak 5: Izdvoji hiperveze

Hiperveze se pohranjuju na pojedinačnim TextRun čvorovima. Provjerite Style.IsHyperlink i pročitajte 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}")

Korak 6: Izdvoji tekst po stranici

Za izdvajanje teksta organiziranog po naslovu stranice:

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)

Uobičajeni problemi i rješenja

1. ImportError: Nema modula pod nazivom ‘aspose’

Uzrok: Paket nije instaliran u aktivnom Python okruženju.

Ispravak:

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

2. FileNotFoundError pri učitavanju .one datoteke

Uzrok: Put datoteke je netočan ili datoteka ne postoji.

Popravak: Koristite apsolutnu putanju ili provjerite postoji li datoteka prije učitavanja:

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 na Windowsu pri ispisu

Uzrok: Windows terminali mogu koristiti staru kodiranje koje ne može prikazati Unicode znakove.

Popravak: Rekonfigurirajte stdout na početku vašeg skripta:

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

4. Rezultati praznog teksta

Uzrok: Datoteka .one može biti prazna, sadržavati samo slike ili tablice (bez RichText čvorova), ili biti datoteka bilježnice (.onetoc2) umjesto datoteke odjeljka (.one).

Popravak: Provjerite broj stranica i pregledajte vrste čvorova:

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

Uzrok: Datoteka .one je šifrirana. Šifrirani dokumenti nisu podržani.

Fix: Aspose.Note FOSS za Python ne podržava šifrirane .one datoteke. Potpuno opremljeni komercijalni proizvod Aspose.Note podržava dešifriranje.


Često postavljana pitanja

Mogu li izvući tekst sa svih stranica odjednom?

Da. doc.GetChildNodes(RichText) pretražuje cijelo stablo dokumenta rekurzivno, uključujući sve stranice, konture i elemente konture.

Podržava li biblioteka .onetoc2 bilježničke datoteke?

Ne. Biblioteka obrađuje samo datoteke odjeljka .one. Datoteke tablice sadržaja bilježnice (.onetoc2) su drugačiji format i nisu podržane.

Mogu li izvući tekst iz tablica?

Da. TableCell čvorovi sadrže RichText djecu koja se mogu čitati na isti način:

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

Koje verzije Pythona su podržane?

Python 3.10, 3.11 i 3.12.

Je li biblioteka thread‑safe?

Svaka Document instanca treba biti korištena iz jedne niti. Za paralelno izdvajanje, stvorite zasebnu Document po niti.


Povezani resursi:

 Hrvatski