Como Extrair Texto de Arquivos OneNote em Python

Como Extrair Texto de Arquivos OneNote em Python

Os arquivos Microsoft OneNote .one são documentos binários que não podem ser lidos como texto simples ou analisados com ferramentas genéricas XML. O Aspose.Note FOSS for Python fornece um parser puro‑Python que carrega arquivos .one em um modelo completo de objeto de documento (DOM), tornando simples a extração programática de texto, metadados de formatação e hyperlinks.

Benefícios de Usar Aspose.Note FOSS para Python

  1. Não é necessário Microsoft Office: leia arquivos .one em qualquer plataforma, incluindo servidores Linux CI/CD
  2. Acesso total ao texto e formatação: texto simples, trechos em negrito/itálico/sublinhado, propriedades de fonte e URLs de hiperlink
  3. Gratuito e de código aberto: licença MIT, sem taxas de uso ou chaves de API

Guia passo a passo

Etapa 1: Instale o Aspose.Note FOSS para Python

Instale a biblioteca a partir do PyPI. O pacote principal não tem dependências obrigatórias:

pip install aspose-note

Verifique a instalação:

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

Etapa 2: Carregar o arquivo .one

Crie uma instância Document passando o caminho do arquivo:

from aspose.note import Document

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

Para carregar a partir de um fluxo binário (por exemplo, de armazenamento em nuvem ou de uma resposta HTTP):

from aspose.note import Document

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

Etapa 3: Extrair Todo o Texto Simples

Use GetChildNodes(RichText) para coletar cada nó RichText na árvore do documento. Isso realiza uma busca recursiva em profundidade em todas as páginas, contornos e elementos de contorno:

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 salvar todo o texto em um arquivo:

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

Etapa 4: Inspecionar Execuções Formatadas

Cada nó RichText contém uma lista TextRuns de segmentos TextRun. Cada execução carrega um TextStyle independente com formatação por caractere:

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

Etapa 5: Extrair hyperlinks

Os hyperlinks são armazenados em nós individuais TextRun. Verifique Style.IsHyperlink e leia 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}")

Etapa 6: Extrair Texto Por Página

Para extrair texto organizado por título da 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 Comuns e Soluções

1. ImportError: Nenhum módulo chamado ‘aspose’

Causa: O pacote não está instalado no ambiente Python ativo.

Correção:

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

2. FileNotFoundError ao carregar arquivo .one

Causa: O caminho do arquivo está incorreto ou o arquivo não existe.

Correção: Use um caminho absoluto ou verifique se o arquivo existe antes de carregá-lo:

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 no Windows ao imprimir

Causa: Terminais Windows podem usar uma codificação legada que não consegue renderizar caracteres Unicode.

Correção: Reconfigure stdout no início do seu script:

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

4. Resultados de texto vazio

Causa: O arquivo .one pode estar vazio, conter apenas imagens ou tabelas (sem nós RichText), ou ser um arquivo de notebook (.onetoc2) em vez de um arquivo de seção (.one).

Correção: Verifique a contagem de páginas e inspecione os tipos de nó:

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: O arquivo .one está criptografado. Documentos criptografados não são suportados.

Fix: Aspose.Note FOSS for Python não suporta arquivos criptografados .one. O produto comercial completo Aspose.Note oferece suporte à descriptografia.


Perguntas Frequentes

Posso extrair texto de todas as páginas de uma vez?

Sim. doc.GetChildNodes(RichText) pesquisa toda a árvore do documento recursivamente, incluindo todas as páginas, esboços e elementos de esboço.

A biblioteca suporta arquivos de notebook .onetoc2?

Não. A biblioteca lida apenas com arquivos de seção .one. Arquivos de índice de cadernos (.onetoc2) são um formato diferente e não são suportados.

Posso extrair texto de tabelas?

Sim. TableCell nós contêm RichText filhos que podem ser lidos da mesma forma:

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

Quais versões do Python são suportadas?

Python 3.10, 3.11 e 3.12.

A biblioteca é thread‑safe?

Cada instância Document deve ser usada a partir de um único thread. Para extração paralela, crie um Document separado por thread.


Recursos Relacionados:

 Português