Cách Trích Xuất Văn Bản Từ Tệp OneNote trong Python

Cách Trích Xuất Văn Bản Từ Tệp OneNote trong Python

Các tệp Microsoft OneNote .one là tài liệu nhị phân không thể đọc dưới dạng văn bản thuần hoặc phân tích bằng các công cụ XML chung. Aspose.Note FOSS for Python cung cấp một bộ phân tích thuần Python, tải các tệp .one vào mô hình đối tượng tài liệu (DOM) đầy đủ, giúp việc trích xuất văn bản, siêu dữ liệu định dạng và siêu liên kết một cách lập trình trở nên đơn giản.

Lợi ích của việc sử dụng Aspose.Note FOSS cho Python

  1. Không cần Microsoft Office: đọc các tệp .one trên bất kỳ nền tảng nào, bao gồm cả máy chủ Linux CI/CD
  2. Truy cập đầy đủ văn bản và định dạng: văn bản thuần, các đoạn in đậm/nghiêng/gạch chân, thuộc tính phông chữ và URL siêu liên kết
  3. Miễn phí và mã nguồn mở: giấy phép MIT, không phí sử dụng hay khóa API

Hướng Dẫn Từng Bước

Bước 1: Cài đặt Aspose.Note FOSS cho Python

Cài đặt thư viện từ PyPI. Gói lõi không có phụ thuộc bắt buộc:

pip install aspose-note

Xác minh việc cài đặt:

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

Bước 2: Tải tệp .one

Tạo một thể hiện Document bằng cách truyền đường dẫn tệp:

from aspose.note import Document

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

Để tải từ luồng nhị phân (ví dụ: từ lưu trữ đám mây hoặc phản hồi HTTP):

from aspose.note import Document

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

Bước 3: Trích xuất toàn bộ văn bản thuần

Sử dụng GetChildNodes(RichText) để thu thập mọi nút RichText trong cây tài liệu. Thao tác này thực hiện một tìm kiếm đệ quy theo chiều sâu trên tất cả các trang, đề mục và các phần tử đề mục:

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)

Để lưu tất cả văn bản vào tệp:

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

Bước 4: Kiểm tra các đoạn đã định dạng

Mỗi nút RichText chứa một danh sách TextRuns các đoạn TextRun. Mỗi đoạn chạy mang một TextStyle độc lập với định dạng từng ký tự:

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

Bước 5: Trích xuất Siêu liên kết

Siêu liên kết được lưu trữ trên các nút TextRun riêng lẻ. Kiểm tra Style.IsHyperlink và đọc 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}")

Bước 6: Trích xuất văn bản theo trang

Để trích xuất văn bản được tổ chức theo tiêu đề trang:

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)

Các vấn đề thường gặp và cách khắc phục

1. ImportError: Không có mô-đun nào có tên ‘aspose’

Nguyên nhân: Gói chưa được cài đặt trong môi trường Python đang hoạt động.

Sửa:

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

2. FileNotFoundError khi tải tệp .one

Nguyên nhân: Đường dẫn tệp không chính xác hoặc tệp không tồn tại.

Fix: Sử dụng đường dẫn tuyệt đối hoặc xác minh tệp tồn tại trước khi tải:

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 trên Windows khi in

Nguyên nhân: Các terminal Windows có thể sử dụng mã hoá cũ không thể hiển thị ký tự Unicode.

Fix: Cấu hình lại stdout ở đầu script của bạn:

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

4. Kết quả văn bản trống

Nguyên nhân: Tệp .one có thể rỗng, chỉ chứa hình ảnh hoặc bảng (không có nút RichText), hoặc là tệp notebook (.onetoc2) thay vì tệp section (.one).

Sửa: Kiểm tra số trang và kiểm tra các loại nút:

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

Nguyên nhân: Tệp .one được mã hóa. Các tài liệu được mã hóa không được hỗ trợ.

Fix: Aspose.Note FOSS cho Python không hỗ trợ các tệp được mã hóa .one. Sản phẩm thương mại Aspose.Note đầy đủ tính năng hỗ trợ giải mã.


Câu hỏi thường gặp

Tôi có thể trích xuất văn bản từ tất cả các trang cùng một lúc không?

Có. doc.GetChildNodes(RichText) tìm kiếm toàn bộ cây tài liệu một cách đệ quy, bao gồm tất cả các trang, đề mục và các phần tử đề mục.

Thư viện có hỗ trợ các tệp sổ tay .onetoc2 không?

Không. Thư viện chỉ xử lý các tệp phần .one. Các tệp mục lục sổ tay (.onetoc2) là một định dạng khác và không được hỗ trợ.

Tôi có thể trích xuất văn bản từ các bảng không?

Có. TableCell nodes chứa các RichText con có thể được đọc theo cùng cách:

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

Phiên bản Python nào được hỗ trợ?

Python 3.10, 3.11 và 3.12.

Thư viện có an toàn với đa luồng không?

Mỗi thể hiện Document nên được sử dụng từ một luồng duy nhất. Đối với việc trích xuất song song, tạo một Document riêng cho mỗi luồng.


Tài nguyên liên quan:

 Tiếng Việt