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
- Não é necessário Microsoft Office: leia arquivos
.oneem qualquer plataforma, incluindo servidores Linux CI/CD - Acesso total ao texto e formatação: texto simples, trechos em negrito/itálico/sublinhado, propriedades de fonte e URLs de hiperlink
- 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-noteVerifique 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-note2. 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: