Kaip išgauti tekstą iš OneNote failų naudojant Python

Kaip išgauti tekstą iš OneNote failų naudojant Python

Microsoft OneNote .one failai yra dvejetainiai dokumentai, kurių negalima skaityti kaip paprasto teksto arba analizuoti su bendriniais XML įrankiais. Aspose.Note FOSS for Python suteikia gryną Python analizatorių, kuris įkelia .one failus į pilną dokumentų objektų modelį (DOM), leidžiantį lengvai išgauti tekstą, formatavimo metaduomenis ir hipersaitus programiškai.

Aspose.Note FOSS naudojimo privalumai Python

  1. No Microsoft Office required: skaityti .one failus bet kurioje platformoje, įskaitant Linux CI/CD serverius
  2. Full text and formatting access: paprastas tekstas, pusjuodžio/šrifto kursyvo/pabraukimo fragmentai, šrifto savybės ir hipersaitų URL
  3. Free and open-source: MIT licencija, nėra naudojimo mokesčių ar API raktų

Žingsnis po žingsnio vadovas

1 žingsnis: Įdiekite Aspose.Note FOSS for Python

Įdiekite biblioteką iš PyPI. Pagrindinis paketas neturi privalomų priklausomybių:

pip install aspose-note

Patikrinkite diegimą:

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

Žingsnis 2: Įkelti .one failą

Sukurkite Document egzempliorių, perduodant failo kelią:

from aspose.note import Document

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

Įkelti iš dvejetainio srauto (pvz., iš debesų saugyklos arba HTTP atsakymo):

from aspose.note import Document

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

Žingsnis 3: Išgauti visą paprastą tekstą

Naudokite GetChildNodes(RichText), kad surinktumėte visus RichText mazgus dokumento medyje. Tai atlieka rekursinę giliojo pirmumo paiešką per visus puslapius, struktūras ir struktūros elementus:

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)

Norėdami išsaugoti visą tekstą į failą:

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

Žingsnis 4: Peržiūrėti suformatuotus fragmentus

Kiekvienas RichText mazgas turi TextRuns sąrašą TextRun segmentų. Kiekvienas run neša nepriklausomą TextStyle su formatavimu pagal simbolį:

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

Žingsnis 5: Išgauti hipersaitus

Hipersaitai saugomi atskiruose TextRun mazguose. Patikrinkite Style.IsHyperlink ir perskaitykite 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}")

Žingsnis 6: Ištraukti tekstą iš kiekvieno puslapio

Norint išgauti tekstą, organizuotą pagal puslapio pavadinimą:

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)

Dažnos problemos ir sprendimai

1. ImportError: Nėra modulio pavadinimu ‘aspose’

Priežastis: Paketas nėra įdiegtas aktyvioje Python aplinkoje.

Pataisa:

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

2. FileNotFoundError įkeliant .one failą

Cause: Failo kelias yra neteisingas arba failas neegzistuoja.

Fix: Naudokite absoliutų kelią arba patikrinkite, ar failas egzistuoja prieš įkeliant:

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 Windows operacinėje sistemoje spausdinant

Priežastis: Windows terminalai gali naudoti seną koduotę, kuri negali atvaizduoti Unicode simbolių.

Pataisa: Perkonfigūruokite stdout skripto pradžioje:

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

4. Tuščio teksto rezultatai

Priežastis: Failas .one gali būti tuščias, jame gali būti tik paveikslėliai arba lentelės (nėra RichText mazgų), arba tai gali būti užrašų knygos failas (.onetoc2), o ne sekcijos failas (.one).

Fix: Patikrinkite puslapių skaičių ir patikrinkite mazgo tipus:

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

Priežastis: Failas .one yra užšifruotas. Užšifruoti dokumentai nepalaikomi.

Fix: Aspose.Note FOSS for Python nepalaiko šifruotų .one failų. Pilnai funkcionalus komercinis Aspose.Note produktas palaiko dešifravimą.


Dažniausiai užduodami klausimai

Ar galiu ištraukti tekstą iš visų puslapių vienu metu?

Taip. doc.GetChildNodes(RichText) ieško viso dokumento medžio rekursiškai, įskaitant visus puslapius, apžvalgas ir apžvalgos elementus.

Ar biblioteka palaiko .onetoc2 užrašų knygos failus?

Ne. Biblioteka apdoroja tik .one sekcijos failus. Užrašų knygos turinio lentelės failai (.onetoc2) yra kitokio formato ir nėra palaikomi.

Ar galiu išgauti tekstą iš lentelių?

Taip. TableCell mazgai turi RichText vaikų, kuriuos galima skaityti taip pat:

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

Kokios Python versijos palaikomos?

Python 3.10, 3.11 ir 3.12.

Ar biblioteka yra gijų saugi?

Kiekviena Document egzempliorius turėtų būti naudojamas iš vienos gijos. Norint atlikti lygiagretų išskyrimą, sukurkite atskirą Document kiekvienai gijai.


Susiję ištekliai:

 Lietuvių