🐍

HTMLをJSONに変換する方法

2024/08/28に公開

やること

HTMLからJSONへの変換を自動化する

前提

インデックスを作成する方法は主にインデクサーを使うかPythonでAzure SDKを使うかの2パターンあると思います。後者の場合はJSON形式のデータが必要となるので(ただしLangChainならその限りではない)、HTMLを簡単にJSONに変換したいというのが主旨です。
今回はサンプルとして、Pythonの公式ドキュメントをJSONに変換してみたいと思います。
https://docs.python.org/ja/3/tutorial/controlflow.html

依存ライブラリ

pip install beautifulsoup4

スクリプト

from bs4 import BeautifulSoup
import json

# HTMLファイルの読み込み
html_file_path = r'C:\meikou\zenn\htmltojson\Python 3.12.5_document.html'
with open(html_file_path, 'r', encoding='utf-8') as file:
    html_content = file.read()

soup = BeautifulSoup(html_content, 'html.parser')

# タイトルと説明を抽出してJSON形式に変換
json_data = []
id_counter = 1

# h1またはh2タグをタイトルとして使用し、その直後のpタグを説明として抽出
for section in soup.find_all(['h1', 'h2']):
    title = section.get_text(strip=True)
    next_paragraph = section.find_next('p')
    description = next_paragraph.get_text(strip=True) if next_paragraph else ""

    json_data.append({
        "Id": str(id_counter),
        "title": title,
        "title_vector": "",
        "description": description,
        "description_vector": ""
    })
    id_counter += 1

# JSONファイルとして保存
json_file_path = r'C:\meikou\zenn\htmltojson\Python 3.12.5_document.json'  
with open(json_file_path, 'w', encoding='utf-8') as json_file:
    json.dump(json_data, json_file, ensure_ascii=False, indent=4)

print("JSONファイルが作成されました:", json_file_path)

実行結果

{
        "Id": "1",
        "title": "4.その他の制御フローツール¶",
        "title_vector": "",
        "description": "前章で紹介したwhile文の他にも、 Python にはいくつか制御フローツールがあり、本章で説明します。",
        "description_vector": ""
    },
    {
        "Id": "2",
        "title": "4.1.if文¶",
        "title_vector": "",
        "description": "おそらく最もおなじみの文型はif文でしょう。例えば:",
        "description_vector": ""
    },
    {
        "Id": "3",
        "title": "4.2.for文¶",
        "title_vector": "",
        "description": "Python のfor文は、読者が C 言語や Pascal 言語で使いなれているかもしれないfor文とは少し違います。 (Pascal のように) 常に算術型の数列にわたる反復を行ったり、 (C のように) 繰返しステップと停止条件を両方ともユーザが定義できるようにするのとは違い、Python のfor文は、任意のシーケンス型 (リストまたは文字列) にわたって反復を行います。反復の順番はシーケンス中に要素が現れる順番です。例えば:",
        "description_vector": ""
    },
    {
        "Id": "4",
        "title": "4.3.range()関数¶",
        "title_vector": "",
        "description": "数列にわたって反復を行う必要がある場合、組み込み関数range()が便利です。この関数は算術型の数列を生成します:",
        "description_vector": ""
    },
    {
        "Id": "5",
        "title": "4.4.break文とcontinue文とループのelse節¶",
        "title_vector": "",
        "description": "break文は、そのbreak文を内包している最も内側にあるfor文またはwhile文から抜け出すことができます。",
        "description_vector": ""
    },
    {
        "Id": "6",
        "title": "4.5.pass文¶",
        "title_vector": "",
        "description": "pass文は何もしません。passは、文を書くことが構文上要求されているが、プログラム上何の動作もする必要がない時に使われます:",
        "description_vector": ""
    },
    {
        "Id": "7",
        "title": "4.6.match文¶",
        "title_vector": "",
        "description": "match文は1つの式を指定し、その値と次に続く1つ以上のcaseブロックに指定されたパターンを比較します。この機能はCやJava、JavaScript(や他の多数の言語)のswitch文と表面的には似ていますが、RustやHaskellのパターンマッチングにより似ています。最初にマッチしたパターンのみが実行され、コンポーネント(シーケンスの要素やオブジェクトの属性)から値を取り出して変数に代入することもできます。",
        "description_vector": ""
    },
    {
        "Id": "8",
        "title": "4.7.関数を定義する¶",
        "title_vector": "",
        "description": "フィボナッチ数列 (Fibonacci series) を任意の上限値まで書き出すような関数を作成できます:",
        "description_vector": ""
    },
    {
        "Id": "9",
        "title": "4.8.関数定義についてもう少し¶",
        "title_vector": "",
        "description": "可変個の引数を伴う関数を定義することもできます。引数の定義方法には 3 つの形式があり、それらを組み合わせることができます。",
        "description_vector": ""
    },
    {
        "Id": "10",
        "title": "4.9.間奏曲: コーディングスタイル¶",
        "title_vector": "",
        "description": "これからより長くより複雑な Python のコードを書いていくので、そろそろコーディングスタイルについて語っても良い頃です。ほとんどの言語は様々なスタイルで書け (もっと簡潔に言えばフォーマットでき)、スタイルによって読み易さが異なります。他人にとって読み易いコードにしようとするのはどんなときでも良い考えであり、良いコーディングスタイルを採用することが非常に強力な助けになります。",
        "description_vector": ""
    }
]
ヘッドウォータース

Discussion