Как да извлечете текст от OneNote файлове в Python

Как да извлечете текст от OneNote файлове в Python

Microsoft OneNote .one файлове са бинарни документи, които не могат да се четат като обикновен текст или да се анализират с общи XML инструменти. Aspose.Note FOSS for Python предоставя чисто-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 възел в дървото на документа. Това извършва рекурсивно търсене в дълбочина (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-note

2. 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 за всяка нишка.


Свързани ресурси:

 Български