استخراج متن از فایل‌های OneNote با استفاده از Python

اگر نیاز دارید متن را از Microsoft OneNote بخوانید .one فایل‌ها را در یک اسکریپت Python، بدون نصب Microsoft Office یا اجرای ویندوز،, Aspose.Note FOSS for Python راه‌حل است. این یک کتابخانه ۱۰۰٪ رایگان و متن‌باز است که فرمت باینری OneNote را به‌صورت مستقیم تجزیه می‌کند و یک API تمیز Python را ارائه می‌دهد.

نصب

pip install aspose-note

بدون کلید API. بدون فایل لایسنس. بدون Microsoft Office.


ساده‌ترین روش: GetChildNodes(RichText)

متن OneNote در RichText گره‌هایی که در صفحات، طرح‌واره‌ها و عناصر طرح‌واره توزیع شده‌اند، ذخیره می‌شود. GetChildNodes(RichText) یک جستجوی بازگشتی در کل درخت سند انجام می‌دهد و هر گره متنی را به‌صورت یک لیست صاف برمی‌گرداند:

from aspose.note import Document, RichText

doc = Document("MyNotes.one")
for rt in doc.GetChildNodes(RichText):
    if rt.Text:
        print(rt.Text)

این سریع‌ترین راه برای استخراج تمام محتوای متنی از یک .one فایل.


ذخیره متن در یک فایل

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

استخراج متن به‌صورت صفحه به صفحه

وقتی نیاز دارید بدانید هر بلوک متنی از کدام صفحه آمده است:

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)

استخراج پیوندهای ابرمتنی

پیوندهای ابرمتنی بر روی موارد جداگانه ذخیره می‌شوند TextRun اشیاء درون RichText گره‌ها. بررسی کنید 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}")

تشخیص قالب‌بندی: ضخیم، ایتالیک، زیرخط

هر TextRun قالب‌بندی هر کاراکتر را از طریق آن 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}")

خواندن از یک جریان

با ذخیره‌سازی ابری، بدنه‌های پاسخ HTTP یا بافرهای در‑حافظه کار می‌کند:

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

رفع مشکل رمزگذاری در ویندوز

در ترمینال‌های ویندوز،, sys.stdout ممکن است از یک رمزگذاری قدیمی استفاده کند که در کاراکترهای یونیکد باعث سقوط می‌شود. این را در ابتدای اسکریپت خود اضافه کنید:

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

آنچه کتابخانه پشتیبانی می‌کند

ویژگیپشتیبانی شده
خواندن .one فایل‌ها (مسیر یا جریان)بله
استخراج RichText.Text (متن ساده)بله
بررسی TextRun.Style (پررنگ، کج، پیوند، قلم)بله
استخراج متن از سلول‌های جدولبله
خواندن عناوین صفحهبله
به … بنویس .oneنه
اسناد رمزگذاری شدهنه

مراحل بعدی