プログラム make_sitemap_from_path.py の技術ドキュメント


プログラムの動作

make_sitemap_from_path.py は、指定されたディレクトリ以下のHTMLファイルを再帰的に検索し、その結果をもとにHTML形式のサイトマップを自動生成するPythonスクリプトです。

主な機能:

  • 指定されたルートディレクトリから .html 拡張子を持つファイルを全て検索します。

  • 検索対象から除外したいディレクトリ名やファイルパスを正規表現パターンで指定できます。

  • 各HTMLファイルの内容を読み込み、<title> タグからページのタイトルを抽出します。<title> タグが見つからない場合は、ファイル名をタイトルの代替とします。

  • 抽出したタイトルとHTMLファイルの相対パスを用いて、HTML形式のサイトマップを作成します。サイトマップは <ul> リスト形式で、各ファイルへのハイパーリンクを含みます。

  • 生成されたサイトマップは、指定されたファイル名で保存されます。

解決する課題:

ウェブサイトの構造が複雑であったり、ファイル数が多かったりする場合に、手動でサイトマップを作成する手間を大幅に削減します。これにより、サイト訪問者がウェブサイトのコンテンツを容易に把握できるようになり、SEO(検索エンジン最適化)の改善にも寄与します。


原理

このプログラムは、以下のアルゴリズムと技術を組み合わせてサイトマップを生成します。

  1. ディレクトリトラバーサル: os.walk() 関数を使用し、指定されたルートディレクトリ以下を再帰的に探索します。これにより、すべてのサブディレクトリとファイルにアクセスできます。

  2. HTMLファイルの識別: 探索された各ファイルのファイル名が .html で終わるかどうかを filename.lower().endswith(".html") で判定します。これにより、大文字小文字を区別せずHTMLファイルを識別します。

  3. 除外パターンによるフィルタリング: コマンドライン引数 --exclude で指定された正規表現パターンは re.compile() を用いてコンパイルされます。 ファイル検索時には、各ディレクトリパスとファイルパスがこれらのコンパイルされたパターンにマッチするかどうかを any(p.search(path)) でチェックします。もし一致するパターンがあれば、そのディレクトリ内のファイルや該当ファイル自体はサイトマップの対象から除外されます。

  4. タイトル抽出: HTMLファイルからタイトルを抽出するために、正規表現 r"<title>(.*?)</title>" を使用します。

    • re.IGNORECASE: 大文字小文字を区別せずに <title><TITLE> をマッチさせます。

    • re.DOTALL: . メタ文字が改行文字にもマッチするようにします。これにより、<title> タグとその閉じタグの間に改行が含まれていても、正しくタイトルを抽出できます。

    • (.*?): タイトルの中身を非貪欲にキャプチャします。これにより、複数の <title> タグがある場合でも最初のタイトルだけを正確に抽出します。 タイトルが見つからない場合は、フォールバックとしてファイル名が使用されます。

  5. 相対パスの生成と統一: サイトマップ内のリンクは、ルートディレクトリからの相対パスである必要があります。 Path.relative_to(root) メソッドを使用して相対パスを取得し、as_posix() メソッドでパスセパレータをWindows環境でも / に統一することで、クロスプラットフォームなURLを生成します。

  6. HTMLサイトマップの構築: 発見され、フィルタリングされたHTMLファイルのリストは、まずソートされます。その後、各ファイルについて抽出されたタイトルと相対パスを用いて、標準的なHTML <ul> および <li> タグを含む文字列を構築します。最終的にこれらの文字列を結合して完全なHTMLサイトマップドキュメントを生成します。


必要な非標準ライブラリとインストール方法

このプログラムはPythonの標準ライブラリのみを使用しており、pip を用いた追加の非標準ライブラリのインストールは必要ありません。


必要な入力ファイル

プログラムは、以下の形式を持つHTMLファイルを入力として期待します。

  • ファイル形式: .html または .htm 拡張子を持つファイル。

  • データ構造: 特別な構造は要求されませんが、各HTMLファイルにはオプションで <head> セクション内に <title>ここにタイトル</title> タグが含まれていることが望ましいです。このタグが存在しない場合、プログラムはそのファイル名をタイトルとして使用します。

  • 配置: 指定されたルートディレクトリの任意のサブディレクトリに配置されていること。

例:

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>これはサンプルページです</title>
</head>
<body>
    <h1>ようこそ</h1>
    <p>このページはサイトマップに含まれます。</p>
</body>
</html>

生成される出力ファイル

プログラムは、以下の形式でサイトマップファイルを生成します。

  • ファイル名: デフォルトは sitemap.html ですが、コマンドライン引数で任意の名前に変更できます。

  • 内容: HTML 5形式のサイトマップドキュメント。以下の構造を持ちます。

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset='utf-8'>
        <title>Site Map</title>
    </head>
    <body>
        <h1>Site Map</h1>
        <ul>
            <li><a href='path/to/file1.html'>ファイル1のタイトル</a> (path/to/file1.html)</li>
            <li><a href='path/to/file2.html'>ファイル2のタイトル</a> (path/to/file2.html)</li>
            <!-- 他のHTMLファイルへのリンクが続く -->
        </ul>
    </body>
    </html>
    

    <li> 要素には、対応するHTMLファイルへの相対パスを示すリンクと、抽出されたタイトル、そして括弧書きで相対パスが記載されます。ファイルリストはアルファベット順にソートされます。


コマンドラインでの使用例 (Usage)

make_sitemap_from_path.py スクリプトは、以下の基本構文で実行できます。

python make_sitemap_from_path.py [root_directory] [output_filename] [--exclude PATTERN [PATTERN ...]]

引数の説明:

  • root_directory: サイトマップを生成するためにHTMLファイルを検索するルートディレクトリを指定します。 省略した場合、現在の作業ディレクトリ (.) が使用されます。

  • output_filename: 生成されるサイトマップHTMLファイルのファイル名を指定します。 省略した場合、sitemap.html というファイル名で出力されます。

  • --exclude PATTERN [PATTERN ...]: 検索対象から除外したいディレクトリやファイルのパスに一致する正規表現パターンを1つ以上指定します。複数のパターンはスペースで区切って指定します。 デフォルトでは _vti_cnf というパターンが設定されており、SharePoint関連の隠しディレクトリなどが除外されます。


コマンドラインでの具体的な使用例

ここでは、いくつかの具体的なシナリオでの使用例と、その実行結果について説明します。

事前に、以下のディレクトリ構造とファイルが存在すると仮定します。

.
├── make_sitemap_from_path.py
├── index.html
├── about.html
├── products/
│   ├── item1.html
│   └── item2.html
├── admin/
│   └── login.html
└── temp/
    └── draft.html

index.html: <title>ホームページ</title> about.html: <title>会社概要</title> products/item1.html: <title>製品A</title> products/item2.html: <title>製品B</title> admin/login.html: <title>管理者ログイン</title> temp/draft.html: <title>下書き</title>

例1:デフォルト設定での実行

カレントディレクトリをルートとして、sitemap.html という名前でサイトマップを生成します。

python make_sitemap_from_path.py

実行結果:

Sitemap generated: sitemap.html
Found 6 HTML files under /path/to/current/directory (excluded patterns: ['_vti_cnf'])

このコマンドを実行すると、sitemap.html ファイルが生成され、index.html, about.html, products/item1.html, products/item2.html, admin/login.html, temp/draft.html のすべてのファイルへのリンクが含まれます。

例2:特定のディレクトリを検索し、出力ファイル名を指定

products ディレクトリ以下のHTMLファイルのみを検索し、product_sitemap.html という名前でサイトマップを生成します。

python make_sitemap_from_path.py products product_sitemap.html

実行結果:

Sitemap generated: product_sitemap.html
Found 2 HTML files under /path/to/current/directory/products (excluded patterns: ['_vti_cnf'])

このコマンドでは、products/item1.htmlproducts/item2.html のみがサイトマップに含まれます。

例3:特定のパターンを除外してサイトマップを生成

admin ディレクトリ内のファイルと temp ディレクトリ内のファイルをサイトマップから除外します。

python make_sitemap_from_path.py . sitemap.html --exclude admin temp

実行結果:

Sitemap generated: sitemap.html
Found 4 HTML files under /path/to/current/directory (excluded patterns: ['_vti_cnf', 'admin', 'temp'])

この場合、admin/login.htmltemp/draft.html はサイトマップから除外され、index.html, about.html, products/item1.html, products/item2.html のみで構成されるサイトマップが生成されます。

例4:正規表現を使用して特定のファイルを除外

ファイル名に draft を含むHTMLファイルを除外します。

python make_sitemap_from_path.py . sitemap.html --exclude ".*draft.*"

実行結果:

Sitemap generated: sitemap.html
Found 5 HTML files under /path/to/current/directory (excluded patterns: ['_vti_cnf', '.*draft.*'])

このコマンドでは、temp/draft.html が除外されます。正規表現は引用符で囲むことで、シェルによる誤った解釈を防ぐことができます。