前回は、PythonからWordPressRESTAPIへ接続する準備をしました。
アプリケーションパスワードを作成し、PythonからWordPressのユーザー情報を取得できるか確認しました。
今回は、WordPressへ投稿する前の準備として、Markdownファイルから投稿に必要な情報を読み込む処理を作ります。

いきなりWordPressへ投稿するのではなく、まずはMarkdownファイルをPythonで読み込みます。
この記事では、タイトル、スラッグ、本文を取り出して画面に表示します。

今回作るもの

今回は、Markdown形式で書いた投稿用ファイルをPythonで読み込みます。
読み込む内容は、タイトル、スラッグ、本文です。
カテゴリとタグの項目もMarkdownファイルには用意しますが、今回は対象外です。

今回作るファイルは、次の2つです。

  • sample_article.md
  • read_markdown.py

sample_article.mdに投稿用の記事情報を書きます。
read_markdown.pyでsample_article.mdを読み込み、必要な情報を取り出します。

フォルダ構成

今回は、WordPressへ投稿する本体ツールとは別のフォルダで作ります。
Markdownファイルを読み込む練習なので、投稿ツール本体とは分けます。

フォルダ構成は次のようにします。

public-python-samples/
└─ samples/
   └─ read-markdown-post/
      ├─ sample_article.md
      └─ read_markdown.py

作成したものは以下のGitHubで公開しています。
https://github.com/ojichiku/public-python-samples/tree/main/samples/read-markdown-post

投稿用Markdownファイルを作る

まず、sample_article.mdを作ります。
今回は、Markdownの見出しで投稿情報を分ける形式にします。

sample_article.mdの内容は次のようにします。

# 投稿情報

## 1. タイトル

ChatGPTで作った記事をWordPressへ投稿するテスト

## 2. スラッグ

chatgpt-wordpress-post-test

## 3. カテゴリ

Python

## 4. タグ

ChatGPT,WordPress,Python

## 5. 本文

これはWordPress投稿ツールのテスト用Markdownです。
Pythonでこのファイルを読み込み、タイトル、スラッグ、本文を取り出します。

### 見出しの例

本文には見出しや文章が入ります。
まずは、Markdownの中身をそのまま本文として扱います。

このファイルでは、次の5つの項目を見出しで分けています。

  • タイトル
  • スラッグ
  • カテゴリ
  • タグ
  • 本文

今回は、この中からタイトル、スラッグ、本文だけを取り出します。
カテゴリとタグは、次回以降で扱います。

見出し名は固定にする

今回のコードでは、見出し名を目印にして内容を取り出します。
そのため、見出し名は固定にします。

使う見出し名は次のとおりです。

## 1. タイトル
## 2. スラッグ
## 3. カテゴリ
## 4. タグ
## 5. 本文

Pythonファイルを作る

次に、read_markdown.pyを作ります。
このPythonファイルでは、sample_article.mdを読み込み、タイトル、スラッグ、本文を取り出します。

コードは次のようにします。

from pathlib import Path


TITLE_HEADING = "## 1. タイトル"
SLUG_HEADING = "## 2. スラッグ"
CATEGORY_HEADING = "## 3. カテゴリ"
BODY_HEADING = "## 5. 本文"


def get_section(text: str, start_heading: str, end_heading: str | None = None) -> str:
    if start_heading not in text:
        raise ValueError(f"{start_heading}が見つかりません。")

    start_index = text.index(start_heading) + len(start_heading)

    if end_heading is None:
        section_text = text[start_index:]
    else:
        if end_heading not in text:
            raise ValueError(f"{end_heading}が見つかりません。")

        end_index = text.index(end_heading)
        section_text = text[start_index:end_index]

    return section_text.strip()


def read_markdown(file_path: str) -> dict[str, str]:
    path = Path(file_path)
    text = path.read_text(encoding="utf-8")

    title = get_section(text, TITLE_HEADING, SLUG_HEADING)
    slug = get_section(text, SLUG_HEADING, CATEGORY_HEADING)
    body = get_section(text, BODY_HEADING)

    return {
        "title": title,
        "slug": slug,
        "body": body,
    }


def main() -> None:
    article = read_markdown("sample_article.md")

    print("title:")
    print(article["title"])
    print()
    print("slug:")
    print(article["slug"])
    print()
    print("body:")
    print(article["body"])


if __name__ == "__main__":
    main()

このコードでは、pathlibのPathを使ってMarkdownファイルを読み込んでいます。
そのあと、固定の見出しを目印にして、タイトル、スラッグ、本文を取り出します。

実行して確認する

read_markdown.pyを作成したら、ターミナルで実行します。
read-markdown-postフォルダに移動してから、次のコマンドを実行します。

python read_markdown.py

実行すると、次のように表示されます。

title:
ChatGPTで作った記事をWordPressへ投稿するテスト

slug:
chatgpt-wordpress-post-test

body:
これはWordPress投稿ツールのテスト用Markdownです。
Pythonでこのファイルを読み込み、タイトル、スラッグ、本文を取り出します。

### 見出しの例

本文には見出しや文章が入ります。
まずは、Markdownの中身をそのまま本文として扱います。

タイトル、スラッグ、本文が表示されれば成功です。
この時点では、WordPressにはまだ投稿しません。

うまく読み込めないとき

うまく読み込めない場合は、まず次の3つを確認します。

  • sample_article.mdとread_markdown.pyが同じフォルダにあるか
  • 見出し名がサンプルどおりになっているか
  • ファイル名を間違えていないか

今回のコードは、見出し名を固定して読み込む作りです。
見出し名を変えると、正しく読み込めません。

まとめ

今回は、Markdownファイルからタイトル、スラッグ、本文を取り出すPythonサンプルを作りました。
今回作ったものは、次の3つです。

  • 投稿用Markdownファイルを作った
  • PythonでMarkdownファイルを読み込んだ
  • タイトル、スラッグ、本文を取り出して表示した

次回は、カテゴリとタグの扱いを整理します。
WordPressへ投稿する前に、Markdownファイルに書いたカテゴリ名やタグ名をどのように扱うかを確認していきます。