Cum să extragi text din fișiere OneNote în Python
Fișierele Microsoft OneNote .one sunt documente binare care nu pot fi citite ca text simplu sau analizate cu instrumente XML generice. Aspose.Note FOSS for Python oferă un parser pur Python care încarcă fișierele .one într-un model complet de obiecte de document (DOM), facilitând extragerea programatică a textului, a metadatelor de formatare și a hyperlink‑urilor.
Beneficiile utilizării Aspose.Note FOSS pentru Python
- Fără Microsoft Office necesar: citiți fișiere
.onepe orice platformă, inclusiv servere Linux CI/CD - Acces complet la text și formatare: text simplu, ruluri îngroșate/înclinate/subliniate, proprietăți de font și URL-uri de hyperlink
- Gratuit și cu sursă deschisă: licență MIT, fără taxe de utilizare sau chei API
Ghid pas cu pas
Pasul 1: Instalați Aspose.Note FOSS pentru Python
Instalați biblioteca din PyPI. Pachetul de bază nu are dependențe obligatorii:
pip install aspose-noteVerificați instalarea:
from aspose.note import Document
print("Installation OK")Pasul 2: Încarcă fișierul .one
Creează o instanță Document prin transmiterea căii fișierului:
from aspose.note import Document
doc = Document("MyNotes.one")
print(f"Section: {doc.DisplayName}")
print(f"Pages: {len(list(doc))}")Pentru a încărca dintr-un flux binar (de exemplu, din stocare în cloud sau dintr-un răspuns HTTP):
from aspose.note import Document
with open("MyNotes.one", "rb") as f:
doc = Document(f)Pasul 3: Extrage tot textul simplu
Utilizați GetChildNodes(RichText) pentru a colecta fiecare nod RichText din arborele documentului. Aceasta efectuează o căutare recursivă în adâncime pe toate paginile, contururile și elementele de contur:
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)Pentru a salva tot textul într-un fișier:
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")Pasul 4: Inspectați secvențele formatate
Fiecare nod RichText conține o listă TextRuns de segmente TextRun. Fiecare rulare poartă un TextStyle independent cu formatare pe caracter:
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}")Pasul 5: Extrage hyperlinkuri
Hiperlink-urile sunt stocate pe noduri individuale TextRun. Verificați Style.IsHyperlink și citiți 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}")Pasul 6: Extrage textul pe pagină
Pentru a extrage text organizat pe titlul paginii:
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)Probleme comune și soluții
1. ImportError: Niciun modul numit ‘aspose’
Cauză: Pachetul nu este instalat în mediul activ Python.
Remediere:
pip install aspose-note
##Confirm active environment:
pip show aspose-note2. FileNotFoundError la încărcarea fișierului .one
Cauză: Calea fișierului este incorectă sau fișierul nu există.
Fix: Folosiți o cale absolută sau verificaţi dacă fişierul există înainte de încărcare:
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 pe Windows la imprimare
Cauză: Terminalele Windows pot folosi o codare veche care nu poate reda caractere Unicode.
Fix: Reconfigurați stdout la începutul scriptului:
import sys
if hasattr(sys.stdout, "reconfigure"):
sys.stdout.reconfigure(encoding="utf-8", errors="replace")4. Rezultate cu text gol
Cauză: Fișierul .one poate fi gol, să conțină doar imagini sau tabele (fără noduri RichText) sau să fie un fișier notebook (.onetoc2) în loc de un fișier secțiune (.one).
Remediere: Verificați numărul de pagini și inspectați tipurile de noduri:
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
Cauză: Fișierul .one este criptat. Documentele criptate nu sunt acceptate.
Fix: Aspose.Note FOSS pentru Python nu acceptă fișiere criptate .one. Produsul comercial complet Aspose.Note suportă decriptarea.
Întrebări frecvente
Pot extrage textul de pe toate paginile simultan?
Da. doc.GetChildNodes(RichText) caută întregul arbore al documentului recursiv, incluzând toate paginile, contururile și elementele de contur.
Biblioteca suportă fișierele notebook .onetoc2?
Nu. Biblioteca gestionează doar fișierele de secțiune .one. Fișierele de cuprins ale notebook-ului (.onetoc2) sunt un format diferit și nu sunt suportate.
Pot să extrag text din tabele?
Da. TableCell noduri conțin copii RichText care pot fi citite în același mod:
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()Ce versiuni de Python sunt suportate?
Python 3.10, 3.11 și 3.12.
Este biblioteca thread‑safe?
Fiecare instanță Document ar trebui utilizată dintr-un singur fir de execuție. Pentru extragere paralelă, creaţi un Document separat pentru fiecare fir.
Resurse conexe: