Com extreure text de fitxers OneNote amb Python

Com extreure text de fitxers OneNote amb Python

Els fitxers Microsoft OneNote .one són documents binaris que no es poden llegir com a text pla ni analitzar amb eines XML genèriques. Aspose.Note FOSS for Python proporciona un analitzador pure-Python que carrega els fitxers .one en un model d’objecte de document complet (DOM), facilitant l’extracció programàtica de text, metadades de format i hiperenllaços.

Beneficis d’utilitzar Aspose.Note FOSS per a Python

  1. No es requereix Microsoft Office: llegiu fitxers .one en qualsevol plataforma, inclosos servidors Linux CI/CD
  2. Accés complet al text i al format: text pla, seqüències en negreta/cursiva/subratllat, propietats de la tipografia i URL d’enllaços
  3. Lliure i de codi obert: llicència MIT, sense tarifes d’ús ni claus d’API

Guia pas a pas

Pas 1: Instal·la Aspose.Note FOSS per a Python

Instal·leu la biblioteca des de PyPI. El paquet central no té dependències obligatòries:

pip install aspose-note

Verifiqueu la instal·lació:

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

Pas 2: Carrega el fitxer .one

Creeu una instància Document passant la ruta del fitxer:

from aspose.note import Document

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

Per carregar des d’un flux binari (p. ex. des d’un emmagatzematge al núvol o d’una resposta HTTP):

from aspose.note import Document

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

Pas 3: Extreu tot el text pla

Utilitzeu GetChildNodes(RichText) per recollir cada node RichText en l’arbre del document. Això realitza una cerca recursiva en profunditat en totes les pàgines, esquemes i elements d’esquema:

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)

Per desar tot el text a un fitxer:

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

Pas 4: Inspeccionar les seqüències formatades

Cada node RichText conté una llista TextRuns de segments TextRun. Cada execució porta un TextStyle independent amb formatatge per caràcter:

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

Pas 5: Extreu hiperenllaços

Els hiperenllaços s’emmagatzemen en nodes individuals TextRun. Comproveu Style.IsHyperlink i llegiu 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}")

Pas 6: Extreu text per pàgina

Per extreure text organitzat per títol 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)

Problemes comuns i solucions

1. ImportError: No hi ha cap mòdul anomenat ‘aspose’

Cause: El paquet no està instal·lat en l’entorn Python actiu.

Correcció:

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

2. FileNotFoundError en carregar fitxer .one file

Causa: El camí del fitxer és incorrecte o el fitxer no existeix.

Correcció: Utilitzeu una ruta absoluta o verifiqueu que el fitxer existeixi abans de carregar‑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 a Windows en imprimir

Causa: Els terminals de Windows poden utilitzar una codificació antiga que no pot renderitzar caràcters Unicode.

Correcció: Reconfigura stdout al principi del teu script:

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

4. Resultats de text buit

Causa: El fitxer .one pot estar buit, contenir només imatges o taules (sense nodes RichText), o ser un fitxer de quadern (.onetoc2) en comptes d’un fitxer de secció (.one).

Solució: Comproveu el recompte de pàgines i inspeccioneu els tipus de node:

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: El fitxer .one està encriptat. No s’admeten documents encriptats.

Fix: Aspose.Note FOSS per a Python no admet fitxers encriptats .one. El producte comercial complet d’Aspose.Note admet la desxifració.


Preguntes freqüents

Puc extreure text de totes les pàgines alhora?

Sí. doc.GetChildNodes(RichText) cerca tot l’arbre del document de manera recursiva, incloent totes les pàgines, esquemes i elements d’esquema.

La biblioteca admet fitxers de quadern .onetoc2?

No. La biblioteca gestiona només fitxers de secció .one. Els fitxers de taula de continguts del quadern (.onetoc2) són un format diferent i no són compatibles.

Puc extreure text de taules?

Sí. TableCell nodes contenen RichText fills que es poden llegir de la mateixa manera:

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

Quines versions de Python són compatibles?

Python 3.10, 3.11 i 3.12.

La biblioteca és segura per a fils?

Cada instància Document ha de ser utilitzada des d’un únic fil. Per a l’extracció paral·lela, creeu una Document separada per fil.


Recursos relacionats:

 Català