Extraer texto de archivos OneNote usando Python

Si necesitas leer texto de Microsoft OneNote .one archivos en un script Python, sin instalar Microsoft Office ni ejecutar Windows, Aspose.Note FOSS for Python es la solución. Es una biblioteca 100% gratuita y de código abierto que analiza el formato binario de OneNote directamente y expone una API Python limpia.

Instalar

pip install aspose-note

Sin clave API. Sin archivo de licencia. Sin Microsoft Office.


El enfoque más sencillo: GetChildNodes(RichText)

El texto de OneNote se almacena en RichText nodos distribuidos a lo largo de páginas, esquemas y elementos de esquema. GetChildNodes(RichText) realiza una búsqueda recursiva de todo el árbol del documento y devuelve cada nodo de texto como una lista plana:

from aspose.note import Document, RichText

doc = Document("MyNotes.one")
for rt in doc.GetChildNodes(RichText):
    if rt.Text:
        print(rt.Text)

Esta es la forma más rápida de obtener todo el contenido de texto de un .one archivo.


Guardar texto en un archivo

from aspose.note import Document, RichText

doc = Document("MyNotes.one")
lines = [rt.Text for rt in doc.GetChildNodes(RichText) if rt.Text]

with open("extracted.txt", "w", encoding="utf-8") as f:
    f.write("\n".join(lines))

print(f"Saved {len(lines)} text blocks to extracted.txt")

Extraer texto por página

Cuando necesitas saber de qué página proviene cada bloque de texto:

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)"
    )
    page_texts = [rt.Text for rt in page.GetChildNodes(RichText) if rt.Text]
    print(f"\n=== {title} ===")
    for text in page_texts:
        print(text)

Extraer hipervínculos

Los hipervínculos se almacenan en TextRun objetos dentro de RichText nodos. Verifica run.Style.IsHyperlink:

from aspose.note import Document, RichText

doc = Document("MyNotes.one")
for rt in doc.GetChildNodes(RichText):
    for run in rt.Runs:
        if run.Style.IsHyperlink and run.Style.HyperlinkAddress:
            print(f"{run.Text!r}  ->  {run.Style.HyperlinkAddress}")

Detectar formato: negrita, cursiva, subrayado

Cada TextRun lleva formato por carácter a través de su TextStyle:

from aspose.note import Document, RichText

doc = Document("MyNotes.one")
for rt in doc.GetChildNodes(RichText):
    for run in rt.Runs:
        s = run.Style
        if any([s.Bold, s.Italic, s.Underline]):
            flags = ", ".join(f for f, v in [
                ("bold", s.Bold), ("italic", s.Italic), ("underline", s.Underline)
            ] if v)
            print(f"[{flags}] {run.Text.strip()!r}")

Leer desde un flujo

Funciona con almacenamiento en la nube, cuerpos de respuesta HTTP o buffers en memoria:

import io, urllib.request
from aspose.note import Document, RichText

##Example: load from bytes already in memory
one_bytes = open("MyNotes.one", "rb").read()
doc = Document(io.BytesIO(one_bytes))
texts = [rt.Text for rt in doc.GetChildNodes(RichText) if rt.Text]
print(f"Extracted {len(texts)} text block(s)")

Corrección de codificación en Windows

En terminales de Windows, sys.stdout puede usar una codificación heredada que falla con caracteres Unicode. Añade esto al inicio de tu script:

import sys
if hasattr(sys.stdout, "reconfigure"):
    sys.stdout.reconfigure(encoding="utf-8", errors="replace")

Qué admite la biblioteca

FuncionalidadSoportado
Leer .one archivos (ruta o flujo)
Extraer RichText.Text (texto plano)
Inspeccionar TextRun.Style (negrita, cursiva, hipervínculo, fuente)
Extraer texto de celdas de tabla
Leer títulos de página
Escribir de nuevo a .oneNo
Documentos cifradosNo

Próximos pasos