Извлечение текста из файлов OneNote с помощью Python
Если вам нужно читать текст из Microsoft OneNote .one файлы в скрипте Python, без установки Microsoft Office или запуска Windows, Aspose.Note FOSS for Python это решение. Это на 100% бесплатная, открытая библиотека, которая напрямую разбирает бинарный формат 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)")
Исправление кодировки в Windows
В терминалах Windows, sys.stdout может использовать устаревшую кодировку, которая приводит к сбоям при работе с символами Unicode. Добавьте это в начало вашего скрипта:
import sys
if hasattr(sys.stdout, "reconfigure"):
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
Что поддерживает библиотека
| Функция | Поддерживается |
|---|---|
Читать .one файлы (путь или поток) | Да |
Извлечь RichText.Text (обычный текст) | Да |
Проверить TextRun.Style (жирный, курсивный, гиперссылка, шрифт) | Да |
| Извлечь текст из ячеек таблицы | Да |
| Читать заголовки страниц | Да |
Записать обратно в .one | Нет |
| Зашифрованные документы | Нет |