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
- No se requiere Microsoft Office: leer archivos
.oneen cualquier plataforma, incluidos servidores Linux CI/CD - Acceso completo al texto y formato: texto plano, secuencias en negrita/cursiva/subrayado, propiedades de fuente y URL de hipervínculos
- 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-noteVerifique 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-note2. 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: