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
- Tiada Microsoft Office diperlukan: baca fail
.onepada mana-mana platform, termasuk pelayan Linux CI/CD - Akses teks penuh dan pemformatan: teks biasa, jalur tebal/miring/garis bawah, sifat fon, dan URL pautan hiperteks
- 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-noteSahkan 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-note2. 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: