Cum să extragi text din fișiere OneNote în Python

Cum să extragi text din fișiere OneNote în Python

Fișierele Microsoft OneNote .one sunt documente binare care nu pot fi citite ca text simplu sau analizate cu instrumente XML generice. Aspose.Note FOSS for Python oferă un parser pur Python care încarcă fișierele .one într-un model complet de obiecte de document (DOM), facilitând extragerea programatică a textului, a metadatelor de formatare și a hyperlink‑urilor.

Beneficiile utilizării Aspose.Note FOSS pentru Python

  1. Fără Microsoft Office necesar: citiți fișiere .one pe orice platformă, inclusiv servere Linux CI/CD
  2. Acces complet la text și formatare: text simplu, ruluri îngroșate/înclinate/subliniate, proprietăți de font și URL-uri de hyperlink
  3. Gratuit și cu sursă deschisă: licență MIT, fără taxe de utilizare sau chei API

Ghid pas cu pas

Pasul 1: Instalați Aspose.Note FOSS pentru Python

Instalați biblioteca din PyPI. Pachetul de bază nu are dependențe obligatorii:

pip install aspose-note

Verificați instalarea:

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

Pasul 2: Încarcă fișierul .one

Creează o instanță Document prin transmiterea căii fișierului:

from aspose.note import Document

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

Pentru a încărca dintr-un flux binar (de exemplu, din stocare în cloud sau dintr-un răspuns HTTP):

from aspose.note import Document

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

Pasul 3: Extrage tot textul simplu

Utilizați GetChildNodes(RichText) pentru a colecta fiecare nod RichText din arborele documentului. Aceasta efectuează o căutare recursivă în adâncime pe toate paginile, contururile și elementele de contur:

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)

Pentru a salva tot textul într-un fișier:

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

Pasul 4: Inspectați secvențele formatate

Fiecare nod RichText conține o listă TextRuns de segmente TextRun. Fiecare rulare poartă un TextStyle independent cu formatare pe caracter:

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

Pasul 5: Extrage hyperlinkuri

Hiperlink-urile sunt stocate pe noduri individuale TextRun. Verificați Style.IsHyperlink și citiți 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}")

Pasul 6: Extrage textul pe pagină

Pentru a extrage text organizat pe titlul paginii:

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)

Probleme comune și soluții

1. ImportError: Niciun modul numit ‘aspose’

Cauză: Pachetul nu este instalat în mediul activ Python.

Remediere:

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

2. FileNotFoundError la încărcarea fișierului .one

Cauză: Calea fișierului este incorectă sau fișierul nu există.

Fix: Folosiți o cale absolută sau verificaţi dacă fişierul există înainte de încărcare:

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 pe Windows la imprimare

Cauză: Terminalele Windows pot folosi o codare veche care nu poate reda caractere Unicode.

Fix: Reconfigurați stdout la începutul scriptului:

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

4. Rezultate cu text gol

Cauză: Fișierul .one poate fi gol, să conțină doar imagini sau tabele (fără noduri RichText) sau să fie un fișier notebook (.onetoc2) în loc de un fișier secțiune (.one).

Remediere: Verificați numărul de pagini și inspectați tipurile de noduri:

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

Cauză: Fișierul .one este criptat. Documentele criptate nu sunt acceptate.

Fix: Aspose.Note FOSS pentru Python nu acceptă fișiere criptate .one. Produsul comercial complet Aspose.Note suportă decriptarea.


Întrebări frecvente

Pot extrage textul de pe toate paginile simultan?

Da. doc.GetChildNodes(RichText) caută întregul arbore al documentului recursiv, incluzând toate paginile, contururile și elementele de contur.

Biblioteca suportă fișierele notebook .onetoc2?

Nu. Biblioteca gestionează doar fișierele de secțiune .one. Fișierele de cuprins ale notebook-ului (.onetoc2) sunt un format diferit și nu sunt suportate.

Pot să extrag text din tabele?

Da. TableCell noduri conțin copii RichText care pot fi citite în același mod:

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

Ce versiuni de Python sunt suportate?

Python 3.10, 3.11 și 3.12.

Este biblioteca thread‑safe?

Fiecare instanță Document ar trebui utilizată dintr-un singur fir de execuție. Pentru extragere paralelă, creaţi un Document separat pentru fiecare fir.


Resurse conexe:

 Română