Extrair texto de arquivos OneNote usando Python

Se você precisar ler texto do Microsoft OneNote .one arquivos em um script Python, sem instalar o Microsoft Office ou executar o Windows, Aspose.Note FOSS for Python é a solução. É uma biblioteca 100% gratuita e de código aberto que analisa o formato binário do OneNote diretamente e expõe uma API Python limpa.

Instalar

pip install aspose-note

Sem chave de API. Sem arquivo de licença. Sem Microsoft Office.


A abordagem mais simples: GetChildNodes(RichText)

O texto do OneNote é armazenado em RichText nodes distribuídos por páginas, outlines e elementos de outline. GetChildNodes(RichText) executa uma busca recursiva em toda a árvore do documento e retorna cada nó de texto como uma 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 é a maneira mais rápida de extrair todo o conteúdo de texto de um .one arquivo.


Salvar texto em um arquivo

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

Extrair texto por página

Quando você precisa saber de qual página cada bloco de texto provém:

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)

Os hyperlinks são armazenados em TextRun objetos dentro de RichText nodes. Verifique 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 formatação: negrito, itálico, sublinhado

Cada TextRun carrega formatação por caractere ao longo de seu 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}")

Ler de um Stream

Funciona com armazenamento em nuvem, corpos de respostas HTTP ou buffers em memória:

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

Correção de Codificação do Windows

Nos terminais Windows, sys.stdout pode usar uma codificação legada que falha com caracteres Unicode. Adicione isso no início do seu script:

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

O que a Biblioteca Suporta

RecursoSuportado
Ler .one arquivos (caminho ou fluxo)Sim
Extrair RichText.Text (texto simples)Sim
Inspecionar TextRun.Style (negrito, itálico, hiperlink, fonte)Sim
Extrair texto das células da tabelaSim
Ler títulos das páginasSim
Escrever de volta para .oneNão
Documentos criptografadosNão

Próximos Passos