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
- Není vyžadován Microsoft Office: čtěte soubory
.onena jakékoli platformě, včetně Linux CI/CD serverů - 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ů
- 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-noteOvěř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-note2. 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: