Как да извлечете текст от 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 възел в дървото на документа. Това извършва рекурсивно търсене в дълбочина (depth‑first) във всички страници, контури и елементи на контура:
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: Преглед на форматираните Run‑ове
Всеки 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).
Поправка: Проверете броя на страниците и инспектирайте типовете възли:
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 за 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 за всяка нишка.
Свързани ресурси: