PythonでOneNoteファイルからテキストを抽出する方法

PythonでOneNoteファイルからテキストを抽出する方法

Microsoft OneNote .one ファイルはバイナリ文書であり、プレーンテキストとして読み取ったり、汎用XMLツールで解析したりすることはできません。Aspose.Note FOSS for Python は、純粋な Python パーサーを提供し、.one ファイルを完全なドキュメントオブジェクトモデル(DOM)にロードします。これにより、テキスト、書式設定メタデータ、ハイパーリンクをプログラムで簡単に抽出できます。

Python 用 Aspose.Note FOSS の使用メリット

  1. Microsoft Officeは不要: Linux CI/CDサーバーを含むあらゆるプラットフォームで.oneファイルを読み取れます
  2. テキストと書式への完全アクセス: プレーンテキスト、太字/斜体/下線のラン、フォントプロパティ、ハイパーリンクURL
  3. 無料かつオープンソース: MITライセンス、使用料やAPIキーは不要

ステップバイステップ ガイド

ステップ 1: Aspose.Note FOSS for 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 ノードには、TextRunsTextRun セグメントのリストが含まれています。各ランは、文字ごとの書式設定を持つ独立した 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’ が見つかりません

Cause: パッケージがアクティブな Python 環境にインストールされていません。

修正:

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

2. .one ファイルの読み込み時に FileNotFoundError が発生

Cause: ファイルパスが正しくないか、ファイルが存在しません。

Fix: 絶対パスを使用するか、読み込む前にファイルが存在することを確認してください:

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. Windowsで印刷時にUnicodeEncodeErrorが発生

原因: Windows ターミナルは、Unicode 文字を表示できないレガシー エンコーディングを使用している可能性があります。

Fix: スクリプトの開始時に stdout を再構成してください:

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

4. 空のテキスト結果

Cause: .one ファイルは空であるか、画像や表のみが含まれている(RichText ノードがない)か、セクションファイル(.one)ではなくノートブックファイル(.onetoc2)である可能性があります。

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を作成してください。


関連リソース:

 日本語