Jak získat text z souborů OneNote v jazyce Python

Jak získat text z souborů OneNote v jazyce Python

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

Výhody použití Aspose.Note FOSS pro Python

  1. Nevyžaduje se Microsoft Office:číst: .one soubory na jakékoli platformě, včetně Linuxových CI/CD serverů
  2. Přístup k úplnému textu a formátování: prostý text, tlustá/kurzí/podtržená verze, vlastnosti písma a hypertextové odkazy URL
  3. Volný a open-source: licence MIT, žádné poplatky za používání ani API klíče

Krok za krokem

Krok 1: Nainstalujte Aspose.Note FOSS pro Python

Instalace knihovny z PyPI. Jádro nemá žádné povinné závislosti:

pip install aspose-note

Ověřte instalaci:

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

Krok 2: Nahrát soubor .one

Vytvořit Document instance přenášením cesty souboru:

from aspose.note import Document

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

Na načtení z binárního proudu (např. ze 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: Vytáhnout všechny prosté texty

Použití: GetChildNodes(RichText) pro sběr všech RichText V tomto případě se provádí rekurzivní hluboký vyhledávání všech stránek, obrysů a prvků obvodu:

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 ukládání vyčerpané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é běhy

Každá. RichText uzel obsahuje: TextRuns seznam: TextRun Každá jízda má nezávislou, zcela samostatnou funkci. TextStyle s formátováním na 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: Vytáhnout hypertextové odkazy

Hypertextové odkazy jsou uložené na jednotlivých stránkách. TextRun Zkontrolujte. Style.IsHyperlink a číst. 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: Vytáhnout text na stránku

Pro získá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)

Obvyklé problémy a řešení

1. ImportError: No module named ‘aspose’

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

Opravy:

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

2. FileNotFoundError when loading .one file

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

Opravy: Před načtením použijte absolutní cestu nebo ověřte, zda soubor existuje:

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 on Windows when printing

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

Opravy:Rekonfigurujte stdout na začátku scénáře:

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

4. Empty text results

Příčina::Účetní dvůr: .one soubor může být prázdný, obsahovat pouze obrázky nebo tabulky (bez uzlů RichText) nebo je to soubory notebooku (.onetoc2) spíše než soubor sekcí (.one).

Opravy: Zkontrolujte počet stránek a zkontrolujte 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::Účetní dvůr: .one Zde je kódovaný soubor. Zašifrované dokumenty nejsou podporovány.

Opravy:FOSS pro Python nepodporuje šifrování. .one Plně funkční komerční produkt Aspose.Note podporuje dešifrování.


Časté otázky

Můžu vytáhnout text ze všech stránek najednou?

  • Ano, jsem. doc.GetChildNodes(RichText) rekurzivně vyhledává celý strom dokumentu, včetně všech stránek, obrysů a prvků obvodu.

Podporuje knihovna soubory notebooku .onetoc2?

Ne, v knihovně to zvládnu. .one pouze soubory pro sekci. Soubori pro obsah notebooku (.onetoc2) jsou odlišný formát a nejsou podporovány.

Můžu vytáhnout text z tabulky?

  • Ano, jsem. TableCell uzly obsahují: RichText děti, 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 bezpečná?

Každá. Document Pro paralelní extrakci vytvořte samostatný příklad. Document na vlákno.


Související zdroje:

 Čeština