Come estrarre testo da file OneNote in Python
I file Microsoft OneNote .one sono documenti binari che non possono essere letti come testo semplice o analizzati con strumenti XML generici. Aspose.Note FOSS per Python fornisce un parser pure-Python che carica i file .one in un modello completo di oggetto documento (DOM), rendendo semplice l’estrazione di testo, metadati di formattazione e collegamenti ipertestuali in modo programmatico.
Vantaggi dell’utilizzo di Aspose.Note FOSS per Python
- Nessun Microsoft Office richiesto: leggi i file
.onesu qualsiasi piattaforma, inclusi i server Linux CI/CD - Accesso completo a testo e formattazione: testo semplice, sequenze in grassetto/corsivo/sottolineato, proprietà dei caratteri e URL dei collegamenti ipertestuali
- Gratuito e open source: licenza MIT, nessuna tariffa d’uso o chiavi API
Guida passo-passo
Passo 1: Installa Aspose.Note FOSS per Python
Installa la libreria da PyPI. Il pacchetto core non ha dipendenze obbligatorie:
pip install aspose-noteVerifica l’installazione:
from aspose.note import Document
print("Installation OK")Passo 2: Carica il file .one
Crea un’istanza Document passando il percorso del file:
from aspose.note import Document
doc = Document("MyNotes.one")
print(f"Section: {doc.DisplayName}")
print(f"Pages: {len(list(doc))}")Per caricare da un flusso binario (ad es. da storage cloud o da una risposta HTTP):
from aspose.note import Document
with open("MyNotes.one", "rb") as f:
doc = Document(f)Passo 3: Estrarre tutto il testo semplice
Usa GetChildNodes(RichText) per raccogliere ogni nodo RichText nell’albero del documento. Questo esegue una ricerca ricorsiva in profondità su tutte le pagine, le outline e gli elementi outline:
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)Per salvare tutto il testo in un file:
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")Passo 4: Ispeziona le sequenze formattate
Ogni nodo RichText contiene un elenco TextRuns di segmenti TextRun. Ogni run contiene un TextStyle indipendente con formattazione per carattere:
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}")Passo 5: Estrarre i collegamenti ipertestuali
I collegamenti ipertestuali sono memorizzati su nodi individuali TextRun. Controlla Style.IsHyperlink e leggi 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}")Passo 6: Estrai il testo per pagina
Per estrarre il testo organizzato per titolo della pagina:
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)Problemi comuni e soluzioni
1. ImportError: Nessun modulo chiamato ‘aspose’
Causa: Il pacchetto non è installato nell’ambiente Python attivo.
Correzione:
pip install aspose-note
##Confirm active environment:
pip show aspose-note2. FileNotFoundError durante il caricamento del file .one
Cause: Il percorso del file è errato o il file non esiste.
Correzione: Usa un percorso assoluto o verifica che il file esista prima di caricarlo:
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 su Windows durante la stampa
Causa: I terminali Windows possono utilizzare una codifica legacy che non è in grado di visualizzare i caratteri Unicode.
Correzione: Riconfigura stdout all’inizio del tuo script:
import sys
if hasattr(sys.stdout, "reconfigure"):
sys.stdout.reconfigure(encoding="utf-8", errors="replace")4. Risultati di testo vuoto
Causa: Il file .one può essere vuoto, contenere solo immagini o tabelle (nessun nodo RichText), oppure essere un file notebook (.onetoc2) anziché un file di sezione (.one).
Correzione: Controlla il conteggio delle pagine e ispeziona i tipi di nodo:
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
Causa: Il file .one è crittografato. I documenti crittografati non sono supportati.
Fix: Aspose.Note FOSS per Python non supporta i file crittografati .one. Il prodotto commerciale completo Aspose.Note supporta la decrittazione.
Domande frequenti
Posso estrarre il testo da tutte le pagine in una volta?
Sì. doc.GetChildNodes(RichText) ricerca l’intero albero del documento in modo ricorsivo, includendo tutte le pagine, le strutture e gli elementi della struttura.
La libreria supporta i file notebook .onetoc2?
No. La libreria gestisce solo i file di sezione .one. I file di indice del notebook (.onetoc2) sono in un formato diverso e non sono supportati.
Posso estrarre testo dalle tabelle?
Sì. TableCell nodi contengono RichText figli che possono essere letti allo stesso modo:
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()Quali versioni di Python sono supportate?
Python 3.10, 3.11 e 3.12.
La libreria è thread‑safe?
Ogni istanza Document dovrebbe essere utilizzata da un singolo thread. Per l’estrazione parallela, crea un Document separato per thread.
Risorse correlate: