Extreure text de fitxers d’ OneNote amb Python

Si necessites llegir text de Microsoft OneNote .one arxius en un script Python, sense instal·lar Microsoft Office o executar Windows., Aspose.Note FOSS for Python és la solució. És una biblioteca 100% lliure i de codi obert que analisa el format binari d’OneNote directament i exposa una API Python neta.

Instal·lar

pip install aspose-note

No hi ha clau d’API, cap fitxer de llicència ni Microsoft Office.


L’enfocament més senzill: GetChildNodes(RichText)

El text de OneNote s’emmagatzema en: RichText nodes distribuïts a través de pàgines, contorns i elements del contorn. GetChildNodes(RichText) realitza una cerca recursiva de tot l’arbre del document i torna cada nodo de text com a llista plana:

from aspose.note import Document, RichText

doc = Document("MyNotes.one")
for rt in doc.GetChildNodes(RichText):
    if rt.Text:
        print(rt.Text)

Aquesta és la manera més ràpida de treure tot el contingut del text d’un .one Arxiu.


Salvar text en un fitxer

from aspose.note import Document, RichText

doc = Document("MyNotes.one")
lines = [rt.Text for rt in doc.GetChildNodes(RichText) if rt.Text]

with open("extracted.txt", "w", encoding="utf-8") as f:
    f.write("\n".join(lines))

print(f"Saved {len(lines)} text blocks to extracted.txt")

Extracció de text per pàgina

Quan necessites saber de quina pàgina va venir cada bloc de text:

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)"
    )
    page_texts = [rt.Text for rt in page.GetChildNodes(RichText) if rt.Text]
    print(f"\n=== {title} ===")
    for text in page_texts:
        print(text)

Extracció d’hipervincles

Els hipervincles s’emmagatzemen en els enllaços individuals. TextRun objectes dins de RichText Nodes. run.Style.IsHyperlink:

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"{run.Text!r}  ->  {run.Style.HyperlinkAddress}")

Detectar formatatge: en negreta, cursiva i sota línia.

Cada un. TextRun porta formatatge per caràcters a través de la seva TextStyle:

from aspose.note import Document, RichText

doc = Document("MyNotes.one")
for rt in doc.GetChildNodes(RichText):
    for run in rt.TextRuns:
        s = run.Style
        if any([s.IsBold, s.IsItalic, s.IsUnderline]):
            flags = ", ".join(f for f, v in [
                ("bold", s.IsBold), ("italic", s.IsItalic), ("underline", s.IsUnderline)
            ] if v)
            print(f"[{flags}] {run.Text.strip()!r}")

Llegir des d’un corrent

Funciona amb emmagatzematge en el núvol, cossos de resposta HTTP o buffers a la memòria:

import io, urllib.request
from aspose.note import Document, RichText

##Example: load from bytes already in memory
one_bytes = open("MyNotes.one", "rb").read()
doc = Document(io.BytesIO(one_bytes))
texts = [rt.Text for rt in doc.GetChildNodes(RichText) if rt.Text]
print(f"Extracted {len(texts)} text block(s)")

Correcció d’ codificació de Windows

En terminals de Windows, sys.stdout pot utilitzar una codificació legada que s’esvaeix en els caràcters d’Unicode. Afegir això al començament del seu script:

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

El que dóna suport la biblioteca

CaracterísticaAjudat
Llegeix. .one arxius (camí o flux)Sí, sí.
Extracte RichText.Text (text simple)Sí, sí.
Inspecció TextRun.Style (en negreta, en cursiva, hipervincle, font)Sí, sí.
Extracció de text des de les cel·les de la taulaSí, sí.
Llegir títols de pàginesSí, sí.
Escriu-me de nou. .oneNo, no ho sé.
Documents xifratsNo, no ho sé.

Primiers passos