Como extrair texto de arquivos do OneNote em Python

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

  1. Não é necessário Microsoft Office:Leia: .one Arquivos em qualquer plataforma, incluindo servidores de CD/IC Linux.
  2. Acesso ao texto completo e à formatação: texto simples, negrito/italic/sublinhação, propriedades de fonte e URLs de hiperlinks
  3. 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-note

Verificar 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-note

2. 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. TableCell os nós contêm RichText crianç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:

Ver também:

 Português