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
- Nie je potrebný Microsoft Office: čítajte
.onesúbory na akejkoľvek platforme, vrátane Linux CI/CD serverov - 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
- 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-noteOverte 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-note2. 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: