Ako extrahovať text z OneNote súborov v Pythone

Ako extrahovať text z OneNote súborov v Pythone

Microsoft OneNote .one sú binárne dokumenty, ktoré nie je možné čítať ako obyčajný text ani parsovať pomocou všeobecných XML nástrojov. Aspose.Note FOSS for Python poskytuje čistý Python parser, ktorý načíta .one súbory do úplného modelu objektov dokumentu (DOM), čo uľahčuje programové získavanie textu, metadát formátovania a hyperodkazov.

Výhody používania Aspose.Note FOSS pre Python

  1. Nie je potrebný Microsoft Office: čítajte .one súbory na akejkoľvek platforme, vrátane Linux CI/CD serverov
  2. Plný prístup k textu a formátovaniu: obyčajný text, tučné/kurzívy/podčiarknuté úseky, vlastnosti písma a URL adresy hyperodkazov
  3. Bezplatný a open-source: licencia MIT, žiadne poplatky za používanie ani API kľúče

Postupný návod

Krok 1: Nainštalujte Aspose.Note FOSS pre Python

Nainštalujte knižnicu z PyPI. Hlavný balík nemá žiadne povinné závislosti:

pip install aspose-note

Overte inštaláciu:

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

Krok 2: Načítajte súbor .one

Vytvorte inštanciu Document odovzdaním cesty k súboru:

from aspose.note import Document

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

Na načítanie z binárneho prúdu (napr. z cloud úložiska alebo HTTP odpovede):

from aspose.note import Document

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

Krok 3: Extrahovať celý čistý text

Použite GetChildNodes(RichText) na zhromaždenie každého uzla RichText v stromu dokumentu. Toto vykoná rekurzívne hľadanie do hĺbky naprieč všetkými stránkami, osnovami a prvkami osnovy:

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)

Ak chcete uložiť celý text do súboru:

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

Krok 4: Skontrolovať formátované úseky

Každý RichText uzol obsahuje TextRuns zoznam TextRun segmentov. Každý úsek nesie nezávislý TextStyle s formátovaním na úrovni 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}")

Krok 5: Extrahovať hypertextové odkazy

Hyperlinky sú uložené na jednotlivých TextRun uzloch. Skontrolujte Style.IsHyperlink a prečítajte si 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}")

Krok 6: Extrahovať text po stránke

Na extrahovanie textu usporiadaného podľa názvu stránky:

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)

Bežné problémy a riešenia

1. ImportError: No module named ‘aspose’

Príčina: Balík nie je nainštalovaný v aktívnom prostredí Pythonu.

Oprava:

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

2. FileNotFoundError pri načítaní súboru .one

Príčina: Cesta k súboru je nesprávna alebo súbor neexistuje.

Oprava: Použite absolútnu cestu alebo overte, že súbor existuje pred načítaním:

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 pri tlači na Windows

Príčina: Windows terminály môžu používať staré kódovanie, ktoré nedokáže vykresliť Unicode znaky.

Oprava: Prekonfigurujte stdout na začiatku vášho skriptu:

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

4. Výsledky prázdneho textu

Cause: Súbor .one môže byť prázdny, obsahovať iba obrázky alebo tabuľky (žiadne RichText uzly), alebo to môže byť súbor poznámkového bloku (.onetoc2) namiesto súboru sekcie (.one).

Oprava: Skontrolujte počet strán a preskúmajte typy uzlov:

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

Príčina: Súbor .one je šifrovaný. Šifrované dokumenty nie sú podporované.

Fix: Aspose.Note FOSS pre Python nepodporuje šifrované .one súbory. Plnohodnotný komerčný produkt Aspose.Note podporuje dešifrovanie.


Často kladené otázky

Môžem extrahovať text zo všetkých strán naraz?

Áno. doc.GetChildNodes(RichText) prehľadáva celý strom dokumentu rekurzívne, vrátane všetkých stránok, osnov a prvkov osnovy.

Podporuje knižnica súbory .onetoc2 notebook?

Nie. Knižnica spracováva iba súbory sekcií .one. Súbory obsahu poznámkových blokov (.onetoc2) sú iný formát a nie sú podporované.

Môžem extrahovať text z tabuliek?

Áno. TableCell uzly obsahujú RichText deti, ktoré je možné čítať rovnakým spôsobom:

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

Aké verzie Pythonu sú podporované?

Python 3.10, 3.11 a 3.12.

Je knižnica bezpečná pre vlákna?

Každá inštancia Document by mala byť používaná z jedného vlákna. Pre paralelnú extrakciu vytvorte samostatnú Document pre každé vlákno.


Súvisiace zdroje:

 Slovenčina