PythonでMarkdownをHTMLに変換する方法

ブログ

今回はPythonでMarkdownをHTMLに変換する方法を紹介します。ブログ記事などをMarkdownで書くことが多いのですが、ブロガーのようなサイトの場合はMarkdownでの投稿ができないため、HTMLに変換する必要があります。そのためPythonを使ってMarkdownをHTMLに変換する方法を調べたところ、かなり簡単にできることが分かりました。拡張機能を使えば、複雑なMarkdownの場合でもHTMLに変換することができるため、それらも併せて紹介していきたいと思います。

PythonでMarkdownをHTMLに変換するために必要なライブラリは「markdown」というライブラリです。このライブラリは非常に短いコードでHTMLに変換するができま基本使い方は以下のようになります。

今回のコードは最後にGoogleColaboratoryにまとめたファイルも共有しています。

インストール

インストールはpipでOKです。

pip install markdown

基本的な使い方

見出しと段落

Markdownテキスト:

# タイトル
これは段落のテキストです。**マークダウン**は簡単に**HTML**に変換できます。

## 見出しh2
### 見出しh3

Pythonコードと変換結果の表示:

import markdown
from IPython.display import HTML, display

# Markdownテキスト
text1 = "# タイトル\nこれは段落のテキストです。**マークダウン**は簡単に**HTML**\n## 見出しh2\n### 見出しh3"

# MarkdownをHTMLに変換して表示する関数
def convert_to_html_and_display(text, extensions=None):
    if extensions is None:
        extensions = []  # デフォルトではエクステンションを使わない
    html = markdown.markdown(text, extensions=extensions)
    print("Markdown:")
    print(text)
    print("\nHTML:")
    display(HTML(html))
    print("\n\n")
    return html

# 変換結果を表示
convert_to_html_and_display(text1)

基本の使い方
見出しが変換されますが、他のパターンも以下のように確認できます。

リスト

Markdownテキスト:

- 項目1
- 項目2
  - サブ項目1
  - サブ項目2
- 項目3

Pythonコードと変換結果の表示:

# Markdownテキスト
text2 = "- 項目1\n- 項目2\n  - サブ項目1\n  - サブ項目2\n- 項目3"

# 変換結果を表示
convert_to_html_and_display(text2)

リスト表示

リンクと画像

Markdownテキスト:

[Googleのウェブサイト](https://www.google.com)
![ロゴ](https://www.example.com/logo.png)

Pythonコードと変換結果の表示:

# Markdownテキスト
text3 = "[Googleのウェブサイト](https://www.google.com)\n![ロゴ](https://www.example.com/logo.png)"

# 変換結果を表示
convert_to_html_and_display(text3)

今回の表示だとロゴはテストなので表示されません
リンク

引用とコードブロック

Markdownテキスト:

> これは引用です。
> 引用の2行目です。

コードの例:

```python
print("Hello, world!")

Pythonコードと変換結果の表示:

```python
# Markdownテキスト
text4 = "> これは引用です。\n> 引用の2行目です。\n\nコードの例:\n\n```python\nprint(\"Hello, world!\")\n```"

# 変換結果を表示
convert_to_html_and_display(text4)

コードと引用
こちらは引用とコードの変換についてです。こちらに関しても、普通の行と同じような書き方で実行することで表示することができます。しかし、複数行の場合にはうまく表示されません。

text4_1 = '''
> これは引用です。
> 引用の2行目です。

コードの例:

```python
import math
print("Hello, world!")
for i in range(19):
    print(math.sqrt(i))
```
'''
html = convert_to_html_and_display(text4_1)

こちらの画像がうまく表示されていない例です。

うまくいかないコード

しかし、このMarkdownというライブラリには拡張機能が存在します。この拡張機能を指定することで、コードをHTMLに変換することもできるようになります。そのための拡張は「fencecode」という拡張になります。以下のコードのように追加します。

html = convert_to_html_and_display(text4_1,['fenced_code'])

うまくいくコード

この拡張によって、複数行のコードの場合にもうまく表示できるようになります。CSSなどでレイアウトを整えている場合は、このままでも問題ありませんが、HTML単体でコード部分を綺麗に表示するためには、更に「codehighlight」という拡張機能を追加することをおすすめします。これを追加することで、HTML単体で綺麗なコードを出力することができます。

pip install pygments
configs = {
    'codehilite':{
        'noclasses': True
    }
}

html = markdown.markdown(
    text4_1,
    extensions=['fenced_code', 'codehilite'],
    extension_configs=configs
)
print("Markdown:")
print(text4_1)
print("\nHTML:")
display(HTML(html))
print("\n\n")

きれいなコード

テーブル

さらに、表を出力する場合です。こちらもデフォルトでは変換できないので、「tables」というエクステンションを指定することで変換できるようになります。

Markdownテキスト:

| 項目 | 価格 |
|------|------|
| アップル | $1 |
| バナナ | $0.5 |
| オレンジ | $0.75 |

Pythonコードと変換結果の表示:

# Markdownテキスト
text5 = "| 項目 | 価格 |\n|------|------|\n| アップル | $1 |\n| バナナ | $0.5 |\n| オレンジ | $0.75 |"

# 変換結果を表示
convert_to_html_and_display(text5, extensions=['tables'])

表

複数の組み合わせ

拡張機能は複数を組み合わせて使うこともできますので、このように複数登録して変換することも可能です。

text = text4_1+text5
html = markdown.markdown(
    text,
    extensions=['fenced_code', 'codehilite','tables'],
    extension_configs=configs
)
print("Markdown:")
print(text)
print("\nHTML:")
display(HTML(html))
print("\n\n")

複合結果

ここまで基本的な変換方法と特によく使う拡張について紹介してきました。さらに細かい拡張については、次の記事で詳しく紹介していますので、ぜひ参考にしてみてください。

そちらの記事では、最終的にどんなMarkdownでも変換できる完成版のコードも掲載しています。

今回のコードは以下のGoogleColaboratoryに同じものがありますので、コードがほしい場合はこちらも使ってください。
コード全体はこちら
さらに、表を出力する場合です。こちらもデフォルトでは変換できないので、「tables」というエクステンションを指定することで変換できるようになります。拡張機能は複数を組み合わせて使うこともできますので、このように複数登録して変換することも可能です。

ここまで基本的な変換方法と特によく使う拡張について紹介してきました。さらに細かい拡張については、次の記事で詳しく紹介していますので、ぜひ参考にしてみてください。

そちらの記事では、最終的にどんなMarkdownでも変換できる完成版のコードも掲載しています。

タイトルとURLをコピーしました