MakeSiteMap プログラム仕様
概要: ウェブサイトのHTMLサイトマップツリービューを生成するスクリプト。
詳細説明: このスクリプトは、指定されたルートURLからウェブサイトを再帰的にクロールし、発見されたリンクから HTML形式の階層的なサイトマップツリービューを生成します。 コマンドライン引数でルートURL、出力ファイル名、ファイル除外設定、および特定のパスパターンに基づいて URLを除外する機能も持ちます。検出された各ページのタイトルと最終更新日もサイトマップに含められます。
関連リンク: MakeSiteMap.py テクニカルドキュメント
- web.MakeSiteMap.build_hierarchy_dict(urls_with_metadata, base_domain)[ソース]
概要: フラットなURLリストから、パスに基づいた階層的な辞書構造を構築する。
詳細説明: クロールによって収集されたURLとそれに対応するメタデータ(タイトル、最終更新日)のフラットな辞書を受け取り、 URLのパスセグメントを基に、ファイルシステムのようなネストされた辞書構造を作成します。 これにより、サイトマップツリービューのレンダリングに適した階層データが準備されます。 クエリパラメータもパスの一部として扱われ、一意のURLがノードとして保持されます。 ルートURLのメタデータは、ツリー構造の最上位ノードとして特別に扱われます。
- パラメータ:
urls_with_metadata -- dict[str, dict[str, str | None]]: URLとそれに対応するメタデータ(タイトル、最終更新日)の辞書。
base_domain -- str: サイトマップを構築する対象のベースドメイン。
- 戻り値:
dict: 階層的に整理されたサイトマップデータ構造。
- web.MakeSiteMap.clean_html_content(html_content)[ソース]
概要: HTMLコンテンツから改行文字を削除し、前後の空白をトリムする。
詳細説明: 与えられたHTML文字列内のすべての改行文字をスペースに置換し、 結果として生じる文字列の前後の空白を削除します。
- パラメータ:
html_content -- str: 処理するHTML文字列。
- 戻り値:
str: 改行とトリムが適用されたHTML文字列。
- web.MakeSiteMap.crawl_recursive(start_url, visited, base_domain, parent='')[ソース]
概要: 指定されたURLからウェブサイトを再帰的にクロールし、検出されたページのメタデータを収集する。
詳細説明: この関数は、ウェブサイトを深さ優先で再帰的にクロールします。 - URLを標準化し、すでに訪問済みのURLや`is_excluded_path`で除外対象と判断されたURLはスキップします。 - `requests`ライブラリを使用してURLをフェッチし、HTTPステータスコードが200でない場合はエラーとして扱います。 - `detect_encoding`で文字コードを判別し、コンテンツを適切にデコードします。 - HTTPレスポンスヘッダーの`Last-Modified`からページの最終更新日を取得し、ISOフォーマットに変換します。 - `get_page_title`でページのタイトルを抽出します。 - `find_urls_in_html`で現在のページ内のすべてのリンクを抽出し、`base_domain`と一致する内部リンクのみをフィルタリングします。 - 検出された子URLに対して再帰的に自身を呼び出し、すべてのURLとそのメタデータを収集します。
- パラメータ:
start_url -- str: クロールを開始するURL。
visited -- set[str]: 訪問済みの標準化されたURLを追跡するためのセット。
base_domain -- str: クロール対象のベースドメイン(異なるドメインへのリンクは追跡しない)。
parent -- str: (オプション) 現在のURLをリンクしている親URL。デバッグやトレースのために使用されます。
- 戻り値:
dict[str, dict[str, str | None]]: URLをキーとし、タイトルと最終更新日を含む辞書。
- web.MakeSiteMap.detect_encoding(response_content)[ソース]
概要: レスポンスコンテンツから文字コードを判別する。
詳細説明: `charset_normalizer`ライブラリを使用して、HTTPレスポンスのバイト列コンテンツの 文字コードを自動的に推測します。
- パラメータ:
response_content -- bytes: 文字コードを判別するバイト列コンテンツ。
- 戻り値:
str: 判別された文字コード名。
- web.MakeSiteMap.find_urls_in_html(html_content, base_url)[ソース]
概要: HTMLコンテンツからリンクを抽出し、絶対URLに変換して返す。
詳細説明: 与えられたHTMLコンテンツから、href, src, url()`パターンにマッチするURLを 正規表現を使って抽出します。 抽出された相対URLは`base_url`を基に絶対URLに変換されます。 メーリングリスト (`mailto:), 電話番号 (tel:), ページの内部アンカー (#), CSSファイル (.css), JavaScriptファイル (.js) などの特定の種類のURLは除外されます。 さらに、`is_target_url`関数を使って、サイトマップに含めるべきファイルタイプ (例: HTMLファイルやディレクトリパス)のURLのみを結果に含めます。
- パラメータ:
html_content -- str: リンクを抽出するHTML文字列。
base_url -- str: 相対URLを絶対URLに変換するための基準となるURL。
- 戻り値:
set[str]: 抽出され、フィルタリングされた絶対URLのセット。
- web.MakeSiteMap.generate_html_sitemap_tree(urls_with_metadata, root_url, output_file)[ソース]
概要: クローリング結果から階層的なHTMLサイトマップファイルを生成し、指定されたファイルパスに保存する。
詳細説明: `crawl_recursive`関数によって収集されたURLとメタデータの辞書を受け取り、 `build_hierarchy_dict`関数でこのデータを階層的な構造に変換します。 次に、`render_tree`関数を呼び出して、その階層構造をHTMLツリービューとしてレンダリングします。 生成されたHTMLコンテンツは、Tailwind CSSを含む事前定義されたHTMLテンプレートに埋め込まれ、 最終的なHTMLサイトマップファイルとして`output_file`に保存されます。
- パラメータ:
urls_with_metadata -- dict[str, dict[str, str | None]]: クロールによって収集されたURLとメタデータの辞書。
root_url -- str: クロールの起点となったルートURL。サイトマップの基点として表示されます。
output_file -- str: サイトマップを保存するHTMLファイルのパス。
- 戻り値:
None
- web.MakeSiteMap.get_page_title(html_content)[ソース]
概要: HTMLコンテンツ内から<title>を抽出する。
詳細説明: 与えられたHTMLコンテンツから`<title>`タグの内容を正規表現で検索し抽出します。 大文字・小文字を区別せず検索し、見つかった場合はその内容をトリムして返します。 `<title>`タグが見つからない場合は「No Title」を返します。
- パラメータ:
html_content -- str: タイトルを抽出するHTML文字列。
- 戻り値:
str: 抽出されたページのタイトル、または「No Title」。
- web.MakeSiteMap.is_excluded_path(url)[ソース]
概要: URLパスが定義された除外パターンにマッチするかどうかをチェックする。
詳細説明: `COMPILED_EXCLUDE_PATHS`グローバル変数に定義された正規表現パターンに対して、 与えられたURLのパス部分(クエリパラメータを含む場合あり)がマッチするかどうかを検査します。 パスが'/'で始まっていない場合、正規表現とのマッチングのために先頭に'/'が追加されます。
- パラメータ:
url -- str: チェックするURL。
- 戻り値:
bool: 除外パターンにマッチすればTrue、そうでなければFalse。
- web.MakeSiteMap.is_target_url(url)[ソース]
概要: URLがサイトマップに含めるべき対象かどうかを判断する。
詳細説明: URLがHTMLファイル(.htmlまたは.shtml)であるか、ファイル名がない(ディレクトリパス)である場合、 またはパスもクエリも存在しない場合はTrueを返します。 `EXCLUDE_FILES`が`True`に設定されている場合、`exclude_file_extensions`リストに定義された 一般的なファイル拡張子を持つURLは対象外とします。
- パラメータ:
url -- str: 判定するURL。
- 戻り値:
bool: 対象のURLであればTrue、そうでなければFalse。
- web.MakeSiteMap.main()[ソース]
概要: スクリプトのメイン実行関数。
詳細説明: この関数は、コマンドライン引数を処理し、RootURL, outpath, EXCLUDE_FILES といったグローバル変数を設定します。 次に、`crawl_recursive`関数を呼び出してウェブサイトを再帰的にクロールし、 すべての発見されたURLとそのメタデータを収集します。 最後に、`generate_html_sitemap_tree`関数を呼び出して、 収集したデータから階層的なHTMLサイトマップファイルを生成します。
- 戻り値:
None
- web.MakeSiteMap.normalize_url(url)[ソース]
概要: URLを標準化し、フラグメント(#以降)を削除する。
詳細説明: `urllib.parse`モジュールを使用してURLを解析し、URLのフラグメント部分 ('#'に続く部分)を除去した新しいURLを再構築します。 これにより、同じコンテンツを指すがフラグメントが異なるURLが重複して扱われるのを防ぎます。 クエリパラメータは保持されます。
- パラメータ:
url -- str: 標準化するURL。
- 戻り値:
str: フラグメントが削除された標準化されたURL。
- web.MakeSiteMap.render_tree(data, is_root=False)[ソース]
概要: 階層的な辞書構造からHTMLのツリー構造を再帰的に生成する。
詳細説明: build_hierarchy_dict`関数によって構築された階層的なデータ構造を受け取り、 それをHTMLの`details/summary`タグと`ul/`li`タグを組み合わせたツリービューとしてレンダリングします。 ディレクトリに相当するノードは`<details>`タグでラップされ、初期状態で開いた状態(`open`属性)で表示されます。 ファイル(URL)に相当するノードは`<li>`タグ内にリンク、タイトル、URLパス、最終更新日が表示されます。 出力されるHTMLには、Tailwind CSSクラスが適用され、モダンなデザインのツリービューを提供します。
- パラメータ:
data -- dict: 階層的なサイトマップデータ構造。
is_root -- bool: (オプション) 現在処理中のノードがツリーのルートであるかを示すフラグ。デフォルトはFalse。
- 戻り値:
str: 生成されたHTML文字列。