Cómo extraer texto de archivos OneNote en Python

Cómo extraer texto de archivos OneNote en Python

Los archivos Microsoft OneNote .one son documentos binarios que no pueden leerse como texto plano ni analizarse con herramientas XML genéricas. Aspose.Note FOSS for Python proporciona un analizador puro de Python que carga los archivos .one en un modelo de objeto de documento completo (DOM), lo que facilita la extracción programática de texto, metadatos de formato y enlaces hipertexto.

Beneficios de usar Aspose.Note FOSS para Python

  1. No se requiere Microsoft Office: leer archivos .one en cualquier plataforma, incluidos servidores Linux CI/CD
  2. Acceso completo al texto y formato: texto plano, secuencias en negrita/cursiva/subrayado, propiedades de fuente y URL de hipervínculos
  3. Gratis y de código abierto: licencia MIT, sin tarifas de uso ni claves API

Guía paso a paso

Paso 1: Instalar Aspose.Note FOSS para Python

Instale la biblioteca desde PyPI. El paquete central no tiene dependencias obligatorias:

pip install aspose-note

Verifique la instalación:

from aspose.note import Document
print("Installation OK")

Paso 2: Cargar el archivo .one

Cree una instancia Document pasando la ruta del archivo:

from aspose.note import Document

doc = Document("MyNotes.one")
print(f"Section: {doc.DisplayName}")
print(f"Pages:   {len(list(doc))}")

Para cargar desde un flujo binario (p. ej., desde almacenamiento en la nube o una respuesta HTTP):

from aspose.note import Document

with open("MyNotes.one", "rb") as f:
    doc = Document(f)

Paso 3: Extraer todo el texto plano

Utilice GetChildNodes(RichText) para recopilar cada nodo RichText en el árbol del documento. Esto realiza una búsqueda recursiva en profundidad en todas las páginas, esquemas y elementos de esquema:

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)

Para guardar todo el texto en un archivo:

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")

Paso 4: Inspeccionar fragmentos formateados

Cada nodo RichText contiene una lista TextRuns de segmentos TextRun. Cada ejecución lleva un TextStyle independiente con formato por carácter:

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}")

Paso 5: Extraer hipervínculos

Los hipervínculos se almacenan en nodos TextRun individuales. Consulte Style.IsHyperlink y lea 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}")

Paso 6: Extraer texto por página

Para extraer texto organizado por título de página:

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)

Problemas comunes y soluciones

1. ImportError: No hay ningún módulo llamado ‘aspose’

Causa: El paquete no está instalado en el entorno activo de Python.

Corrección:

pip install aspose-note
##Confirm active environment:
pip show aspose-note

2. FileNotFoundError al cargar archivo .one

Causa: La ruta del archivo es incorrecta o el archivo no existe.

Corrección: Use una ruta absoluta o verifique que el archivo exista antes de cargarlo:

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 en Windows al imprimir

Causa: Los terminales de Windows pueden usar una codificación heredada que no puede renderizar caracteres Unicode.

Corrección: Reconfigura stdout al inicio de tu script:

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

4. Resultados de texto vacío

Causa: El archivo .one puede estar vacío, contener solo imágenes o tablas (sin nodos RichText), o ser un archivo de cuaderno (.onetoc2) en lugar de un archivo de sección (.one).

Arreglo: Verifique el recuento de páginas e inspeccione los tipos de 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: El archivo .one está cifrado. Los documentos cifrados no son compatibles.

Fix: Aspose.Note FOSS for Python no admite archivos encriptados .one. El producto comercial completo de Aspose.Note admite el descifrado.


Preguntas frecuentes

¿Puedo extraer texto de todas las páginas a la vez?

Sí. doc.GetChildNodes(RichText) busca todo el árbol del documento de forma recursiva, incluyendo todas las páginas, esquemas y elementos de esquema.

¿La biblioteca admite archivos de cuaderno .onetoc2?

No. La biblioteca maneja solo archivos de sección .one. Los archivos de tabla de contenido del cuaderno (.onetoc2) son un formato diferente y no son compatibles.

¿Puedo extraer texto de tablas?

Sí. TableCell nodos contienen RichText hijos que pueden leerse de la misma manera:

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()

¿Qué versiones de Python son compatibles?

Python 3.10, 3.11 y 3.12.

¿La biblioteca es segura para subprocesos?

Cada instancia Document debe usarse desde un solo hilo. Para extracción paralela, cree una Document separada por hilo.


Recursos relacionados:

 Español