🐍
HTMLをJSONに変換する方法
やること
HTMLからJSONへの変換を自動化する
前提
インデックスを作成する方法は主にインデクサーを使うかPythonでAzure SDKを使うかの2パターンあると思います。後者の場合はJSON形式のデータが必要となるので(ただしLangChainならその限りではない)、HTMLを簡単にJSONに変換したいというのが主旨です。
今回はサンプルとして、Pythonの公式ドキュメントをJSONに変換してみたいと思います。
依存ライブラリ
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