Kako izvući tekst iz OneNote datoteka u Pythonu
Microsoft OneNote .one datoteke su binarni dokumenti koji se ne mogu čitati kao običan tekst niti parsirati generičkim XML alatima. Aspose.Note FOSS for Python pruža čisti Python parser koji učitava .one datoteke u potpuni model objektnog dokumenta (DOM), što olakšava programatsko izdvajanje teksta, metapodataka formatiranja i hiperveza.
Prednosti korištenja Aspose.Note FOSS za Python
- Nije potreban Microsoft Office: čitajte
.onedatoteke na bilo kojoj platformi, uključujući Linux CI/CD poslužitelje - Potpuni pristup tekstu i formatiranju: običan tekst, podebljane/kurzivne/podvučene sekvence, svojstva fonta i URL‑ovi hiperveza
- Besplatan i otvorenog koda: MIT licenca, bez naknada za korištenje ili API ključeva
Vodič korak po korak
Korak 1: Instalirajte Aspose.Note FOSS za Python
Instalirajte biblioteku s PyPI-a. Jezgra paketa nema obaveznih ovisnosti:
pip install aspose-noteProvjerite instalaciju:
from aspose.note import Document
print("Installation OK")Korak 2: Učitaj .one datoteku
Stvorite Document instancu prosljeđivanjem putanje datoteke:
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 pohrane ili HTTP odgovora):
from aspose.note import Document
with open("MyNotes.one", "rb") as f:
doc = Document(f)Korak 3: Izdvoji sav običan tekst
Koristite GetChildNodes(RichText) za prikupljanje svakog RichText čvora u stablu dokumenta. Ovo izvodi 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)Za spremanje cijelog teksta u datoteku:
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: Pregledajte formatirane sekvence
Svaki RichText čvor sadrži TextRuns popis TextRun segmenata. Svaki niz nosi neovisni TextStyle s formatiranjem po 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}")Korak 5: Izdvoji hiperveze
Hiperveze se pohranjuju na pojedinačnim TextRun čvorovima. Provjerite 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: Izdvoji tekst po stranici
Za izdvajanje teksta organiziranog 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)Uobičajeni problemi i rješenja
1. ImportError: Nema modula pod nazivom ‘aspose’
Uzrok: Paket nije instaliran u aktivnom Python okruženju.
Ispravak:
pip install aspose-note
##Confirm active environment:
pip show aspose-note2. FileNotFoundError pri učitavanju .one datoteke
Uzrok: Put datoteke je netočan ili datoteka ne postoji.
Popravak: Koristite apsolutnu putanju ili provjerite postoji li datoteka prije 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 Windowsu pri ispisu
Uzrok: Windows terminali mogu koristiti staru kodiranje koje ne može prikazati Unicode znakove.
Popravak: Rekonfigurirajte 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 tablice (bez RichText čvorova), ili biti datoteka bilježnice (.onetoc2) umjesto datoteke odjeljka (.one).
Popravak: Provjerite broj stranica i pregledajte vrste č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 šifrirana. Šifrirani dokumenti nisu podržani.
Fix: Aspose.Note FOSS za Python ne podržava šifrirane .one datoteke. Potpuno opremljeni komercijalni proizvod Aspose.Note podržava dešifriranje.
Često postavljana pitanja
Mogu li izvući tekst sa svih stranica odjednom?
Da. doc.GetChildNodes(RichText) pretražuje cijelo stablo dokumenta rekurzivno, uključujući sve stranice, konture i elemente konture.
Podržava li biblioteka .onetoc2 bilježničke datoteke?
Ne. Biblioteka obrađuje samo datoteke odjeljka .one. Datoteke tablice sadržaja bilježnice (.onetoc2) su drugačiji format i nisu podržane.
Mogu li izvući tekst iz tablica?
Da. TableCell čvorovi sadrže RichText djecu koja se mogu č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 verzije Pythona su podržane?
Python 3.10, 3.11 i 3.12.
Je li biblioteka thread‑safe?
Svaka Document instanca treba biti korištena iz jedne niti. Za paralelno izdvajanje, stvorite zasebnu Document po niti.
Povezani resursi: