PythonによるHTML内URL一括置換処理

電脳備忘録

本記事のソースコードの利用によって生じた損害について、当方は一切の責任を負いません。ご自身の判断と責任のもとで参照・ご利用ください。

画像生成AIのプロンプト検証

画像生成AIの挙動確認を続けています。生成結果はプロンプトの組み合わせによってある程度制御できるようです。環境構築直後に比べると、指定したキャラクター(凛世)の出力精度は安定してきました。

この技術を活用するためのアイデアがあり、それを実現するためには、この画像生成AIを単なる自己満足のおもちゃではなく、制作ツールとして制御する必要があります。そのため、引き続きプロンプトの研究と、アプリケーションの機能把握を進めていく予定です。

PythonによるURL一括置換処理

話はガラッと変わりますが、複数のHTMLファイルに記述されたURLを書き換える必要が生じました。これを1ファイルずつ手作業で修正するのは時間の浪費であり、ヒューマンエラーの原因にもなります。

そこで、下層ディレクトリを含むすべてのHTMLファイルを対象に、文字列を置換するPythonスクリプトを作成し、処理を行いました。手作業では下手したら1時間前後かかる作業が一瞬で完了しました。

ドメイン変更を伴う静的コンテンツの移行など、頻繁に発生する作業ではありませんが、将来的な効率化のために備忘録としてコードを残しておきます。

import os

# --- 設定 ---
TARGET_DIR = 'htdocs'  # 対象のディレクトリ
SEARCH_TEXT = 'https://aaaa.com'  # 検索する文字列
REPLACE_TEXT = 'https://bbbb.jp'           # 置換後の文字列
TARGET_EXTENSIONS = ('.html', '.htm')        # 対象とする拡張子
# ------------

def replace_string_in_files(directory):
    replace_count = 0
    
    # ディレクトリを再帰的に探索
    for root, dirs, files in os.walk(directory):
        for filename in files:
            # 拡張子が対象のものか確認
            if filename.lower().endswith(TARGET_EXTENSIONS):
                filepath = os.path.join(root, filename)
                
                try:
                    # まずUTF-8で読み込みを試みる
                    encoding = 'utf-8'
                    try:
                        with open(filepath, 'r', encoding=encoding) as f:
                            content = f.read()
                    except UnicodeDecodeError:
                        # UTF-8で失敗した場合、Shift_JIS (cp932) を試す
                        encoding = 'cp932'
                        with open(filepath, 'r', encoding=encoding) as f:
                            content = f.read()

                    # 文字列が含まれている場合のみ書き込み処理を行う
                    if SEARCH_TEXT in content:
                        new_content = content.replace(SEARCH_TEXT, REPLACE_TEXT)
                        
                        with open(filepath, 'w', encoding=encoding) as f:
                            f.write(new_content)
                        
                        print(f"[置換完了] ({encoding}): {filepath}")
                        replace_count += 1
                    
                except Exception as e:
                    print(f"[エラー] {filepath} の処理中にエラーが発生しました: {e}")

    print("-" * 30)
    print(f"処理が終了しました。合計 {replace_count} つのファイルを書き換えました。")

if __name__ == '__main__':
    # ディレクトリが存在するか確認
    if os.path.exists(TARGET_DIR):
        print(f"ディレクトリ '{TARGET_DIR}' 以下のファイルを処理します...")
        replace_string_in_files(TARGET_DIR)
    else:
        print(f"エラー: ディレクトリ '{TARGET_DIR}' が見つかりません。")

効率化できる作業は徹底して一括処理できるようにし、浮いた時間と精神的リソースは、自分のために使います。

0%