Extreu text dels fitxers OneNote usant Python

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

Instal·la

pip install aspose-note

Cap clau d’API. Cap fitxer de llicència. Cap Microsoft Office.


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

El text de OneNote s’emmagatzema a RichText nodes distribuïts per pàgines, esquemes i elements d’esquema. GetChildNodes(RichText) realitza una cerca recursiva de tot l’arbre del document i retorna cada node de text com una 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 d’obtenir tot el contingut de text d’un .one fitxer.


Desa el text a 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")

Extreu text per pàgina

Quan necessites saber de quina pàgina prové 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)

Extreu enllaços

Els hiperenllaços s’emmagatzemen en elements individuals TextRun dins d’objectes RichText nodes. Comprova run.Style.IsHyperlink:

from aspose.note import Document, RichText

doc = Document("MyNotes.one")
for rt in doc.GetChildNodes(RichText):
    for run in rt.Runs:
        if run.Style.IsHyperlink and run.Style.HyperlinkAddress:
            print(f"{run.Text!r}  ->  {run.Style.HyperlinkAddress}")

Detecta format: Negreta, Cursiva, Subratllat

Cada TextRun porta format per caràcter a través del seu TextStyle:

from aspose.note import Document, RichText

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

Llegeix des d’un flux

Funciona amb emmagatzematge al núvol, cossos de resposta HTTP o buffers en 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ó de codificació a Windows

Als terminals de Windows, sys.stdout pot utilitzar una codificació antiga que falla amb caràcters Unicode. Afegeix això al principi del teu script:

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

Què admet la biblioteca

FuncionalitatCompatible
Llegir .one fitxers (ruta o flux)
Extreu RichText.Text (text pla)
Inspeccionar TextRun.Style (negreta, cursiva, enllaç, font)
Extreure text de les cel·les de la taula
Llegir títols de pàgina
Escriure de nou a .oneNo
Documents encriptatsNo

Propers passos