Kā izvilkt tekstu no OneNote failiem, izmantojot Python

Kā izvilkt tekstu no OneNote failiem, izmantojot Python

Microsoft OneNote .one faili ir bināri dokumenti, kurus nevar nolasīt kā vienkāršu tekstu vai parsēt ar vispārīgiem XML rīkiem. Aspose.Note FOSS for Python nodrošina tīru Python parseri, kas ielādē .one failus pilnā dokumenta objektu modelī (DOM), ļaujot vienkārši izvilkt tekstu, formatēšanas metadatus un hipersaites programmatiski.

Aspose.Note FOSS izmantošanas priekšrocības Python

  1. Nav nepieciešams Microsoft Office: lasīt .one failus jebkurā platformā, ieskaitot Linux CI/CD serverus
  2. Pilna teksta un formatējuma piekļuve: vienkāršs teksts, treknraksta/slīpraksta/papēdes fragmenti, fonta īpašības un hipersaites URL
  3. Bezmaksas un atvērtā koda: MIT licence, nav lietošanas maksas vai API atslēgu

Rokasgrāmata soli pa solim

1. solis: Instalējiet Aspose.Note FOSS priekš Python

Instalējiet bibliotēku no PyPI. Galvenajam paketē nav obligātu atkarību:

pip install aspose-note

Pārbaudiet instalāciju:

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

2. solis: ielādēt .one failu

Izveidojiet Document instance, nododot faila ceļu:

from aspose.note import Document

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

Lai ielādētu no binārā straumes (piemēram, no mākoņa glabātuves vai HTTP atbildes):

from aspose.note import Document

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

Solis 3: Izvilkt visu vienkāršo tekstu

Izmantojiet GetChildNodes(RichText), lai savāktu katru RichText mezglu dokumenta kokā. Tas veic rekursīvu dziļuma pirmās meklēšanas meklēšanu visās lapās, struktūrās un struktūru elementos:

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)

Lai saglabātu visu tekstu 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")

Solis 4: Pārbaudīt formatētās virknes

Katrs RichText mezgls satur TextRuns sarakstu ar TextRun segmentiem. Katrs run nes neatkarīgu TextStyle ar rakstzīmju līmeņa formatēšanu:

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

Solis 5: Izvilkt hipersaites

Hipersaites tiek glabātas atsevišķos TextRun mezglos. Pārbaudiet Style.IsHyperlink un izlasiet 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}")

6. solis: Izvilkt tekstu katrā lapā

Lai izvilktu tekstu, kas organizēts pēc lapas nosaukuma:

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)

Biežas problēmas un risinājumi

1. ImportError: Nav atrasts modulis ‘aspose’

Iemesls: Pakete nav instalēta aktīvajā Python vidē.

Labojums:

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

2. FileNotFoundError, ielādējot .one failu

Iemesls: Faila ceļš ir nepareizs vai fails neeksistē.

Fix: Izmantojiet absolūto ceļu vai pārbaudiet, vai fails pastāv pirms ielādes:

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 sistēmā drukājot

Iemesls: Windows termināli var izmantot mantoto kodējumu, kas nevar attēlot Unicode rakstzīmes.

Fix: Pārkonfigurējiet stdout skripta sākumā:

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

4. Tukša teksta rezultāti

Iemesls: Fails .one var būt tukšs, var saturēt tikai attēlus vai tabulas (nav RichText mezglu), vai arī tas var būt piezīmju grāmatiņas fails (.onetoc2) nevis sekcijas fails (.one).

Fix: Pārbaudiet lapu skaitu un pārbaudiet mezglu 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

Iemesls: Fails .one ir šifrēts. Šifrēti dokumenti netiek atbalstīti.

Fix: Aspose.Note FOSS for Python neat atbalsta šifrētus .one failus. Pilnvērtīgais komerciālais Aspose.Note produkts atbalsta atšifrēšanu.


Biežāk uzdotie jautājumi

Vai varu izvilkt tekstu no visām lapām vienlaicīgi?

Jā. doc.GetChildNodes(RichText) meklē visu dokumenta koku rekursīvi, ieskaitot visas lapas, satura rādītājus un satura rādītāja elementus.

Vai bibliotēka atbalsta .onetoc2 piezīmju grāmatas failus?

Nē. Bibliotēka apstrādā tikai .one sadaļas failus. Piezīmju grāmatas satura rādītāja faili (.onetoc2) ir citā formātā un netiek atbalstīti.

Vai es varu izvilkt tekstu no tabulām?

Jā. TableCell mezgli satur RichText bērnus, kas var tikt nolasīti tā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()

Kādas Python versijas tiek atbalstītas?

Python 3.10, 3.11 un 3.12.

Vai bibliotēka ir pavediena droša?

Katru Document instanci jāizmanto no viena pavediena. Lai veiktu paralēlu izguvi, izveidojiet atsevišķu Document katram pavedienam.


Saistītie resursi:

 Latviešu