Cara Mengekstrak Teks dari Fail OneNote dalam Python

Cara Mengekstrak Teks dari Fail OneNote dalam Python

Fail Microsoft OneNote .one adalah dokumen binari yang tidak dapat dibaca sebagai teks biasa atau diparse dengan alat XML generik. Aspose.Note FOSS untuk Python menyediakan parser pure-Python yang memuatkan fail .one ke dalam model objek dokumen penuh (DOM), menjadikannya mudah untuk mengekstrak teks, metadata pemformatan, dan hiperpaut secara programatik.

Manfaat Menggunakan Aspose.Note FOSS untuk Python

  1. Tiada Microsoft Office diperlukan: baca fail .one pada mana-mana platform, termasuk pelayan Linux CI/CD
  2. Akses teks penuh dan pemformatan: teks biasa, jalur tebal/miring/garis bawah, sifat fon, dan URL pautan hiperteks
  3. Percuma dan sumber terbuka: lesen MIT, tiada yuran penggunaan atau kunci API

Panduan Langkah demi Langkah

Langkah 1: Pasang Aspose.Note FOSS untuk Python

Pasang perpustakaan dari PyPI. Pakej teras tidak mempunyai kebergantungan wajib:

pip install aspose-note

Sahkan pemasangan:

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

Langkah 2: Muatkan Fail .one

Buat satu contoh Document dengan menghantar laluan fail:

from aspose.note import Document

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

Untuk memuatkan dari aliran binari (contohnya dari storan awan atau respons HTTP):

from aspose.note import Document

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

Langkah 3: Ekstrak Semua Teks Biasa

Gunakan GetChildNodes(RichText) untuk mengumpulkan setiap nod RichText dalam pokok dokumen. Ini melakukan carian mendalam secara rekursif merentasi semua halaman, rangka, dan elemen rangka:

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)

Untuk menyimpan semua teks ke dalam 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")

Langkah 4: Periksa Jaluran Berformat

Setiap RichText node mengandungi senarai TextRuns segmen TextRun. Setiap run membawa TextStyle bebas dengan pemformatan per-aksara:

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

Langkah 5: Ekstrak Pautan Hiper

Pautan hiper disimpan pada nod TextRun individu. Periksa Style.IsHyperlink dan baca 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}")

Langkah 6: Ekstrak Teks Per Halaman

Untuk mengekstrak teks yang disusun mengikut tajuk halaman:

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)

Isu Umum dan Penyelesaian

1. ImportError: Tiada modul bernama ‘aspose’

Punca: Pakej tidak dipasang dalam persekitaran Python yang aktif.

Pembetulan:

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

2. FileNotFoundError semasa memuatkan fail .one

Punca: Laluan fail tidak betul atau fail tidak wujud.

Pembetulan: Gunakan laluan mutlak atau sahkan fail wujud sebelum dimuatkan:

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 pada Windows semasa mencetak

Punca: Terminal Windows mungkin menggunakan pengekodan warisan yang tidak dapat memaparkan aksara Unicode.

Fix: Konfigurasikan semula stdout pada permulaan skrip anda:

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

4. Keputusan teks kosong

Punca: Fail .one mungkin kosong, mengandungi hanya imej atau jadual (tiada nod RichText), atau menjadi fail buku nota (.onetoc2) bukannya fail bahagian (.one).

Pembetulan: Periksa bilangan halaman dan periksa jenis nod:

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

Punca: Fail .one disulitkan. Dokumen yang disulitkan tidak disokong.

Fix: Aspose.Note FOSS untuk Python tidak menyokong fail terenkripsi .one. Produk komersial Aspose.Note yang lengkap menyokong penyahsulitan.


Soalan Lazim

Bolehkah saya mengekstrak teks dari semua halaman sekaligus?

Ya. doc.GetChildNodes(RichText) mencari seluruh pokok dokumen secara rekursif, termasuk semua halaman, outline, dan elemen outline.

Adakah perpustakaan menyokong fail buku nota .onetoc2?

Tidak. Perpustakaan hanya mengendalikan fail bahagian .one. Fail jadual kandungan buku nota (.onetoc2) adalah format yang berbeza dan tidak disokong.

Bolehkah saya mengekstrak teks daripada jadual?

Ya. TableCell nod mengandungi anak RichText yang boleh dibaca dengan cara yang sama:

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

Versi Python apa yang disokong?

Python 3.10, 3.11, dan 3.12.

Adakah perpustakaan selamat untuk penggunaan berbilang benang?

Setiap contoh Document harus digunakan dari satu thread. Untuk pengekstrakan selari, buat Document berasingan bagi setiap thread.


Sumber Berkaitan:

 Bahasa Melayu