Come estrarre testo da file OneNote in Python

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

  1. Nessun Microsoft Office richiesto: leggi i file .one su qualsiasi piattaforma, inclusi i server Linux CI/CD
  2. Accesso completo a testo e formattazione: testo semplice, sequenze in grassetto/corsivo/sottolineato, proprietà dei caratteri e URL dei collegamenti ipertestuali
  3. 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-note

Verifica 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-note

2. 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:

 Italiano