วิธีดึงข้อความจากไฟล์ OneNote ด้วย Python

วิธีดึงข้อความจากไฟล์ OneNote ด้วย Python

ไฟล์ Microsoft OneNote .one เป็นเอกสารไบนารีที่ไม่สามารถอ่านเป็นข้อความธรรมดาหรือแยกวิเคราะห์ด้วยเครื่องมือ XML ทั่วไปได้ Aspose.Note FOSS for Python มีตัวแยกวิเคราะห์แบบ pure-Python ที่โหลดไฟล์ .one ไปยังโมเดลวัตถุเอกสารเต็มรูปแบบ (DOM) ทำให้การสกัดข้อความ, เมตาดาต้าการจัดรูปแบบ, และไฮเปอร์ลิงก์โดยโปรแกรมเป็นเรื่องง่าย.

ประโยชน์ของการใช้ Aspose.Note FOSS สำหรับ Python

  1. ไม่จำเป็นต้องใช้ Microsoft Office: อ่านไฟล์ .one บนแพลตฟอร์มใดก็ได้ รวมถึงเซิร์ฟเวอร์ Linux CI/CD
  2. เข้าถึงข้อความเต็มและการจัดรูปแบบ: ข้อความธรรมดา, ตัวหนา/ตัวเอียง/ขีดเส้นใต้, คุณสมบัติของฟอนต์, และ URL ของไฮเปอร์ลิงก์
  3. ฟรีและโอเพ่นซอร์ส: ใบอนุญาต MIT, ไม่มีค่าธรรมเนียมการใช้งานหรือคีย์ API

คู่มือแบบขั้นตอนต่อขั้นตอน

ขั้นตอนที่ 1: ติดตั้ง Aspose.Note FOSS สำหรับ Python

ติดตั้งไลบรารีจาก PyPI. แพคเกจหลักไม่มีการพึ่งพาที่จำเป็น:

pip install aspose-note

ตรวจสอบการติดตั้ง:

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

ขั้นตอนที่ 2: โหลดไฟล์ .one

สร้างอินสแตนซ์ Document โดยการส่งพาธไฟล์:

from aspose.note import Document

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

เพื่อโหลดจากสตรีมไบนารี (เช่น จากที่เก็บข้อมูลบนคลาวด์หรือการตอบสนอง HTTP):

from aspose.note import Document

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

ขั้นตอนที่ 3: ดึงข้อความธรรมดาทั้งหมด

ใช้ GetChildNodes(RichText) เพื่อรวบรวมโหนด RichText ทุกโหนดในต้นไม้เอกสาร การทำเช่นนี้จะทำการค้นหาแบบลึกก่อนแบบเรียกซ้ำทั่วทุกหน้า, โครงร่างและองค์ประกอบของโครงร่าง:

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)

เพื่อบันทึกข้อความทั้งหมดลงในไฟล์:

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

ขั้นตอนที่ 4: ตรวจสอบรันที่จัดรูปแบบ

แต่ละโหนด RichText มีรายการ TextRuns ของส่วน TextRun. แต่ละรันมี TextStyle ที่เป็นอิสระพร้อมการจัดรูปแบบต่ออักขระ:

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

ขั้นตอนที่ 5: ดึงไฮเปอร์ลิงก์

ไฮเปอร์ลิงก์จะถูกจัดเก็บบนโหนด TextRun แต่ละอัน ตรวจสอบ Style.IsHyperlink และอ่าน 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: ดึงข้อความต่อหน้า

เพื่อดึงข้อความที่จัดเรียงตามชื่อหน้า:

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)

ปัญหาทั่วไปและการแก้ไข

1. ImportError: ไม่พบโมดูลชื่อ ‘aspose’

สาเหตุ: แพ็กเกจไม่ได้ติดตั้งในสภาพแวดล้อม Python ที่ใช้งานอยู่

แก้ไข:

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

2. FileNotFoundError เมื่อโหลดไฟล์ .one

Cause: เส้นทางไฟล์ไม่ถูกต้องหรือไฟล์ไม่มีอยู่

แก้ไข: ใช้เส้นทางแบบเต็มหรือยืนยันว่าไฟล์มีอยู่ก่อนโหลด:

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 เมื่อพิมพ์

สาเหตุ: เทอร์มินัลของ Windows อาจใช้การเข้ารหัสแบบเก่าที่ไม่สามารถแสดงอักขระ Unicode ได้

Fix: ปรับค่า stdout ใหม่ที่จุดเริ่มต้นของสคริปต์ของคุณ:

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

4. ผลลัพธ์ข้อความว่าง

Cause: ไฟล์ .one อาจว่างเปล่า, มีเพียงรูปภาพหรือ ตาราง (ไม่มีโหนด RichText), หรือเป็นไฟล์โน้ตบุ๊ก (.onetoc2) แทนไฟล์ส่วน (.one).

Fix: ตรวจสอบจำนวนหน้าและตรวจสอบประเภทโหนด:

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

สาเหตุ: ไฟล์ .one ถูกเข้ารหัส. เอกสารที่เข้ารหัสไม่ได้รับการสนับสนุน.

Fix: Aspose.Note FOSS for Python ไม่รองรับไฟล์ที่เข้ารหัส .one. ผลิตภัณฑ์ Aspose.Note เชิงพาณิชย์ที่เต็มรูปแบบรองรับการถอดรหัส.


คำถามที่พบบ่อย

ฉันสามารถสกัดข้อความจากทุกหน้าได้พร้อมกันหรือไม่?

ใช่. doc.GetChildNodes(RichText) ค้นหาต้นไม้เอกสารทั้งหมดแบบเรียกซ้ำ รวมถึงทุกหน้า, โครงร่าง, และองค์ประกอบของโครงร่าง.

ไลบรารีสนับสนุนไฟล์โน้ตบุ๊ก .onetoc2 หรือไม่?

ไม่. ไลบรารีจัดการไฟล์ส่วน .one เท่านั้น ไฟล์สารบัญของโน้ตบุ๊ก (.onetoc2) เป็นรูปแบบที่แตกต่างและไม่รองรับ.

ฉันสามารถสกัดข้อความจากตารางได้หรือไม่?

ใช่. โหนด TableCell มีลูกโหนด RichText ที่สามารถอ่านได้ในลักษณะเดียวกัน:

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

เวอร์ชันของ Python ที่รองรับมีอะไรบ้าง?

Python 3.10, 3.11, และ 3.12.

ไลบรารีนี้ปลอดภัยต่อเธรดหรือไม่?

แต่ละ Document อินสแตนซ์ควรใช้จากเธรดเดียว สำหรับการสกัดแบบขนาน ให้สร้าง Document แยกต่างหากต่อเธรดหนึ่ง.


แหล่งข้อมูลที่เกี่ยวข้อง:

 ภาษาไทย