Kako izvući tekst iz OneNote fajlova u Pythonu
Microsoft OneNote .one fajlovi su binarni dokumenti koji se ne mogu čitati kao običan tekst ili parsirati generičkim XML alatima. Aspose.Note FOSS for Python pruža čisti‑Python parser koji učitava .one fajlove u kompletan model objektnog dokumenta (DOM), čineći jednostavnim programatsko izdvajanje teksta, metapodataka o formatiranju i hiperveza.
Prednosti korišćenja Aspose.Note FOSS za Python
- Nije potreban Microsoft Office: čitajte
.onefajlove na bilo kojoj platformi, uključujući Linux CI/CD servere - Potpun pristup tekstu i formatiranju: običan tekst, podebljane/kurzivne/podvučene sekvence, svojstva fonta i URL‑ove hiperveza
- Besplatan i otvorenog koda: MIT licenca, bez naknada za korišćenje ili API ključeva
Vodič korak po korak
Korak 1: Instalirajte Aspose.Note FOSS za Python
Instalirajte biblioteku sa PyPI. Core paket nema obavezne zavisnosti:
pip install aspose-noteProverite instalaciju:
from aspose.note import Document
print("Installation OK")Korak 2: Učitaj .one fajl
Kreirajte Document instancu prosleđivanjem putanje do fajla:
from aspose.note import Document
doc = Document("MyNotes.one")
print(f"Section: {doc.DisplayName}")
print(f"Pages: {len(list(doc))}")Za učitavanje iz binarnog toka (npr. iz cloud skladišta ili HTTP odgovora):
from aspose.note import Document
with open("MyNotes.one", "rb") as f:
doc = Document(f)Korak 3: Izvuci sav običan tekst
Koristite GetChildNodes(RichText) da sakupite svaki RichText čvor u stablu dokumenta. Ovo izvršava rekurzivno pretraživanje po dubini kroz sve stranice, konture i elemente konture:
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)Da biste sačuvali sav tekst u fajl:
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")Korak 4: Pregled formatiranih delova
Svaki RichText čvor sadrži TextRuns listu TextRun segmenata. Svaki run nosi nezavisni TextStyle sa formatiranjem po karakteru:
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}")Korak 5: Ekstrakcija hiperveza
Hiperveze se čuvaju na pojedinačnim TextRun čvorovima. Proverite Style.IsHyperlink i pročitajte 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}")Korak 6: Ekstrakcija teksta po stranici
Za izdvajanje teksta organizovanog po naslovu stranice:
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)Česti problemi i popravke
1. ImportError: Nema modula pod nazivom ‘aspose’
Uzrok: Paket nije instaliran u aktivnom Python okruženju.
Ispravka:
pip install aspose-note
##Confirm active environment:
pip show aspose-note2. FileNotFoundError prilikom učitavanja .one fajla
Uzrok: Putanja do datoteke je netačna ili datoteka ne postoji.
Popravka: Koristite apsolutnu putanju ili proverite da li fajl postoji pre učitavanja:
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 na Windows‑u prilikom ispisa
Uzrok: Windows terminali mogu koristiti staru kodnu stranicu koja ne može prikazati Unicode znakove.
Popravka: Ponovo konfigurišite stdout na početku vašeg skripta:
import sys
if hasattr(sys.stdout, "reconfigure"):
sys.stdout.reconfigure(encoding="utf-8", errors="replace")4. Rezultati praznog teksta
Uzrok: Datoteka .one može biti prazna, sadržavati samo slike ili tabele (bez RichText čvorova), ili biti datoteka beležnice (.onetoc2) umesto datoteke sekcije (.one).
Fix: Proverite broj stranica i pregledajte tipove čvorova:
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
Uzrok: Datoteka .one je šifrovana. Šifrovani dokumenti nisu podržani.
Fix: Aspose.Note FOSS za Python ne podržava šifrovane .one fajlove. Potpuno opremljeni komercijalni proizvod Aspose.Note podržava dešifrovanje.
Često postavljana pitanja
Mogu li izvući tekst sa svih stranica odjednom?
Da. doc.GetChildNodes(RichText) pretražuje celo stablo dokumenta rekurzivno, uključujući sve stranice, konture i elemente konture.
Da li biblioteka podržava .onetoc2 notebook fajlove?
Ne. Biblioteka obrađuje samo fajlove sekcije .one. Fajlovi sadržaja beležnice (.onetoc2) su drugi format i nisu podržani.
Mogu li izvući tekst iz tabela?
Da. TableCell čvorovi sadrže RichText decu koja se mogu pročitati na isti način:
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()Koje Python verzije su podržane?
Python 3.10, 3.11 i 3.12.
Da li je biblioteka thread‑safe?
Svaka Document instanca treba da se koristi iz jedne niti. Za paralelno izdvajanje, kreirajte zaseban Document po niti.
Povezani resursi: