Jak extrahovat text ze souborů OneNote v Pythonu

Jak extrahovat text ze souborů OneNote v Pythonu

Microsoft OneNote .one soubory jsou binární dokumenty, které nelze číst jako prostý text ani parsovat pomocí obecných XML nástrojů. Aspose.Note FOSS for Python poskytuje čistý Python parser, který načte .one soubory do úplného modelu objektového dokumentu (DOM), což usnadňuje programově extrahovat text, metadata formátování a hypertextové odkazy.

Výhody používání Aspose.Note FOSS pro Python

  1. Není vyžadován Microsoft Office: čtěte soubory .one na jakékoli platformě, včetně Linux CI/CD serverů
  2. Plný přístup k textu a formátování: prostý text, tučné/kurzivní/podtržené úseky, vlastnosti písma a URL hypertextových odkazů
  3. Zdarma a open-source: licence MIT, žádné poplatky za používání ani API klíče

Průvodce krok za krokem

Krok 1: Nainstalujte Aspose.Note FOSS pro Python

Nainstalujte knihovnu z PyPI. Jádrový balíček nemá žádné povinné závislosti:

pip install aspose-note

Ověřte instalaci:

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

Krok 2: Načtěte soubor .one

Vytvořte instanci Document předáním cesty k souboru:

from aspose.note import Document

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

Pro načtení z binárního proudu (např. z cloudového úložiště nebo HTTP odpovědi):

from aspose.note import Document

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

Krok 3: Extrahovat veškerý prostý text

Použijte GetChildNodes(RichText) k sesbírání každého uzlu RichText ve stromu dokumentu. Toto provádí rekurzivní prohledávání do hloubky napříč všemi stránkami, osnovami a prvky 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)

Pro uložení veškerého textu do souboru:

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: Zkontrolujte formátované úseky

Každý RichText uzel obsahuje TextRuns seznam TextRun segmentů. Každý běh nese nezávislý TextStyle s formátováním na úrovni znaků:

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: Extrahovat hypertextové odkazy

Hypertextové odkazy jsou uloženy na jednotlivých uzlech TextRun. Zkontrolujte Style.IsHyperlink a přečtěte 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: Extrahovat text na stránku

Pro extrahování textu uspořádaného podle 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)

Časté problémy a opravy

1. ImportError: Žádný modul pojmenovaný ‘aspose’

Příčina: Balíček není nainstalován v aktivním prostředí Pythonu.

Oprava:

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

2. FileNotFoundError při načítání souboru .one

Příčina: Cesta k souboru je nesprávná nebo soubor neexistuje.

Oprava: Použijte absolutní cestu nebo ověřte, že soubor existuje před načtení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 ve Windows při tisku

Příčina: Terminály Windows mohou používat starší kódování, které nedokáže zobrazit znaky Unicode.

Oprava: Překonfigurujte stdout na začátku skriptu:

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

4. Výsledky prázdného textu

Příčina: Soubor .one může být prázdný, obsahovat pouze obrázky nebo tabulky (žádné uzly RichText), nebo může být souborem poznámkového bloku (.onetoc2) místo souboru sekce (.one).

Oprava: Zkontrolujte počet stránek a prozkoumejte typy uzlů:

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

Příčina: Soubor .one je šifrován. Šifrované dokumenty nejsou podporovány.

Fix: Aspose.Note FOSS pro Python nepodporuje šifrované soubory .one. Plnohodnotný komerční produkt Aspose.Note podporuje dešifrování.


Často kladené otázky

Mohu extrahovat text ze všech stránek najednou?

Ano. doc.GetChildNodes(RichText) prohledává celý strom dokumentu rekurzivně, včetně všech stránek, osnov a prvků osnov.

Podporuje knihovna soubory notebooku .onetoc2?

Ne. Knihovna zpracovává pouze soubory sekcí .one. Soubory obsahu poznámkových bloků (.onetoc2) jsou jiného formátu a nejsou podporovány.

Mohu extrahovat text z tabulek?

Ano. TableCell uzly obsahují RichText podřízené, které lze číst stejným způsobem:

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

Jaké verze Pythonu jsou podporovány?

Python 3.10, 3.11 a 3.12.

Je knihovna vláknově bezpečná?

Každá instance Document by měla být používána z jediného vlákna. Pro paralelní extrakci vytvořte samostatnou Document pro každé vlákno.


Související zdroje:

 Čeština