Як витягнути текст з файлів OneNote у Python
Microsoft OneNote .one файли є бінарними документами, які не можна читати як простий текст або аналізувати за допомогою загальних XML‑інструментів. Aspose.Note FOSS for Python надає чистий Python‑парсер, який завантажує .one файли у повну модель об’єктного документа (DOM), що спрощує програмне вилучення тексту, метаданих форматування та гіперпосилань.
Переваги використання Aspose.Note FOSS для Python
- Не потрібен Microsoft Office: читати
.oneфайли на будь‑якій платформі, включаючи Linux CI/CD сервери - Повний доступ до тексту та форматування: простий текст, жирний/курсивний/підкреслений текст, властивості шрифту та URL‑посилання
- Безкоштовний та з відкритим кодом: ліцензія 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 сегментів. Кожен run несе незалежний 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-note2. FileNotFoundError при завантаженні файлу .one
Причина: Шлях до файлу неправильний або файл не існує.
Виправлення: Використовуйте абсолютний шлях або перевірте, чи існує файл перед завантаженням:
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.
Виправлення: Переналаштуйте stdout на початку вашого скрипту:
import sys
if hasattr(sys.stdout, "reconfigure"):
sys.stdout.reconfigure(encoding="utf-8", errors="replace")4. Результати порожнього тексту
Причина: Файл .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 на кожен потік.
Пов’язані ресурси: