Kako izvući tekst iz OneNote fajlova u Pythonu

Kako izvući tekst iz OneNote fajlova u Pythonu

Microsoft OneNote .one fajlovi su binarni dokumenti koji se ne mogu čitati kao običan tekst ili parsirati generičkim XML alatima. Aspose.Note FOSS for Python pruža čisti‑Python parser koji učitava .one fajlove u kompletan model objektnog dokumenta (DOM), čineći jednostavnim programatsko izdvajanje teksta, metapodataka o formatiranju i hiperveza.

Prednosti korišćenja Aspose.Note FOSS za Python

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

Vodič korak po korak

Korak 1: Instalirajte Aspose.Note FOSS za Python

Instalirajte biblioteku sa PyPI. Core paket nema obavezne zavisnosti:

pip install aspose-note

Proverite instalaciju:

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

Korak 2: Učitaj .one fajl

Kreirajte Document instancu prosleđivanjem putanje do fajla:

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 skladišta ili HTTP odgovora):

from aspose.note import Document

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

Korak 3: Izvuci sav običan tekst

Koristite GetChildNodes(RichText) da sakupite svaki RichText čvor u stablu dokumenta. Ovo izvršava 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)

Da biste sačuvali sav tekst u fajl:

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: Pregled formatiranih delova

Svaki RichText čvor sadrži TextRuns listu TextRun segmenata. Svaki run nosi nezavisni TextStyle sa formatiranjem po karakteru:

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: Ekstrakcija hiperveza

Hiperveze se čuvaju na pojedinačnim TextRun čvorovima. Proverite 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: Ekstrakcija teksta po stranici

Za izdvajanje teksta organizovanog 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)

Česti problemi i popravke

1. ImportError: Nema modula pod nazivom ‘aspose’

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

Ispravka:

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

2. FileNotFoundError prilikom učitavanja .one fajla

Uzrok: Putanja do datoteke je netačna ili datoteka ne postoji.

Popravka: Koristite apsolutnu putanju ili proverite da li fajl postoji pre 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 Windows‑u prilikom ispisa

Uzrok: Windows terminali mogu koristiti staru kodnu stranicu koja ne može prikazati Unicode znakove.

Popravka: Ponovo konfigurišite 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 tabele (bez RichText čvorova), ili biti datoteka beležnice (.onetoc2) umesto datoteke sekcije (.one).

Fix: Proverite broj stranica i pregledajte tipove č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 šifrovana. Šifrovani dokumenti nisu podržani.

Fix: Aspose.Note FOSS za Python ne podržava šifrovane .one fajlove. Potpuno opremljeni komercijalni proizvod Aspose.Note podržava dešifrovanje.


Često postavljana pitanja

Mogu li izvući tekst sa svih stranica odjednom?

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

Da li biblioteka podržava .onetoc2 notebook fajlove?

Ne. Biblioteka obrađuje samo fajlove sekcije .one. Fajlovi sadržaja beležnice (.onetoc2) su drugi format i nisu podržani.

Mogu li izvući tekst iz tabela?

Da. TableCell čvorovi sadrže RichText decu koja se mogu proč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 Python verzije su podržane?

Python 3.10, 3.11 i 3.12.

Da li je biblioteka thread‑safe?

Svaka Document instanca treba da se koristi iz jedne niti. Za paralelno izdvajanje, kreirajte zaseban Document po niti.


Povezani resursi:

 Српски