Como extrair texto de arquivos do OneNote em Python
Microsoft OneNote .one Os arquivos são documentos binários que não podem ser lidos como texto simples ou analisados com ferramentas XML genéricas. Aspose.Note FOSS for Python fornece um parser de Python puro que carrega .one Arquivos em um modelo de objeto completo do documento (DOM), tornando-o simples para extrair texto, formatar metadados e hiperlinks programaticamente.
Benefícios de usar Aspose.Note FOSS para Python
- Não é necessário Microsoft Office:Leia:
.oneArquivos em qualquer plataforma, incluindo servidores de CD/IC Linux. - Acesso ao texto completo e à formatação: texto simples, negrito/italic/sublinhação, propriedades de fonte e URLs de hiperlinks
- Liberto e de código aberto: licença MIT, sem taxas de uso ou chaves API
Guia passo a passo
Passo 1: Instalar Aspose.Note FOSS para Python
Instalar a biblioteca do PyPI. O pacote principal não tem dependências obrigatórias:
pip install aspose-noteVerificar a instalação:
from aspose.note import Document
print("Installation OK")Passo 2: Carregar o ficheiro .one
Criar um Document instância passando o caminho do ficheiro:
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, do armazenamento na nuvem ou uma resposta HTTP):
from aspose.note import Document
with open("MyNotes.one", "rb") as f:
doc = Document(f)Passo 3: Extrair todo o texto simples
Utilização: GetChildNodes(RichText) para recolher cada RichText Nodo na árvore do documento. Isto realiza uma pesquisa recursiva de 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 o texto extraído num ficheiro:
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")Passo 4: Inspecionar executas formatadas
Cada um. RichText nó contém um TextRuns Lista de TextRun Cada corrida tem um segmento independente. TextStyle com formatamento por caracteres:
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}")Passo 5: Extrair hiperlinks
Os hiperlinks são armazenados em cada um dos TextRun Verifique os nódulos. Style.IsHyperlink e ler . 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}")Passo 6: Extrair texto por página
Para extrair 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 comuns e soluções
1. ImportError: No module named ‘aspose’
Causa da morte: O pacote não está instalado no ambiente Python ativo.
Correção:
pip install aspose-note
##Confirm active environment:
pip show aspose-note2. FileNotFoundError when loading .one file
Causa da morte: O caminho do ficheiro é incorreto ou o ficheiros não existem.
Correção: Utilize um caminho absoluto ou verifique a existência do ficheiro antes de carregar:
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 on Windows when printing
Causa da morte: Os terminais Windows podem usar uma codificação herdada que não pode 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. Empty text results
Causa da morte:O Conselho Europeu de Bruxelas: .one O ficheiro pode ser vazio, conter apenas imagens ou tabelas (sem nós RichText) ou um ficheirode notebook (.onetoc2) em vez de um ficheiro de secção (.one).
Correção: Verificar a contagem de páginas e inspecionar os tipos de nós:
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 da morte:O Conselho Europeu de Bruxelas: .one O ficheiro está encriptado. Documentos criptografados não são suportados.
Correção: Aspose.Note FOSS para Python não suporta criptografia .one O produto comercial Aspose.Note com todas as características suporta a decodificação.
Perguntas Frequentes
Posso extrair texto de todas as páginas ao mesmo tempo?
- Sim, é verdade.
doc.GetChildNodes(RichText)Procura toda a árvore de documentos recursivamente, incluindo todas as páginas, contornos e elementos de contorno.
A biblioteca suporta arquivos de notebook .onetoc2?
Não, a biblioteca trata disso. .one Arquivos de tabela de conteúdos para notebooks (.onetoc2) são de um formato diferente e não são suportados.
Posso extrair texto das mesas?
- Sim, é verdade.
TableCellos nós contêmRichTextcrianças que podem ser lidas 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 é segura?
Cada um. Document Para extração paralela, crie um separado. Document por fio.
Recursos relacionados: