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
| Funcionalidad | Soportado |
|---|---|
Leer .one archivos (ruta o flujo) | Sí |
Extraer RichText.Text (texto plano) | Sí |
Inspeccionar TextRun.Style (negrita, cursiva, hipervínculo, fuente) | Sí |
| Extraer texto de celdas de tabla | Sí |
| Leer títulos de página | Sí |
Escribir de nuevo a .one | No |
| Documentos cifrados | No |