【Pythonブログ投稿自動化】URLチェック機能

ブログ

今回の内容

ここまでの内容で基本的な投稿はできるようになりました。
今回は、追加的な機能として、記事の内部にあるURLが機能しているか確認するコードを紹介します。
記事を作成したけど、実はリンクが正しくなかった…ということはよくあります。リンク切れが多いと、ユーザーからの信頼を低下させることにもなります。
そこで、今回は、そのような状況を未然に防ぐための機能を追加したいと思います。

コード

以下のような関数で、マークダウンファイルのURLが404でないか確認します。


def check_urls_in_markdown(path):
    # マークダウンファイルの内容を読み込む
    with open(path, 'r', encoding='utf-8') as file:
        content = file.read()

    # URLを正規表現で抽出
    urls = re.findall(r'\((https?://\S+)\)', content) + re.findall(r'<div class="wp-block-embed__wrapper">\s*(https?://\S+)\s*</div>', content)

    # 各URLに対して存在確認を行う
    link_check = True
    for url in urls:
        try:
            response = requests.get(url, allow_redirects=True, timeout=5)
            link_check = False
            print(f"URL does not exist: {url} in {path}")
        except requests.RequestException as e:
            link_check = False
            print(f"Error checking URL: {url} in {path} - {e}")
    if link_check == False:
        link_input = input('リンクが正しくない部分があります。続けますか?(y)')
        if not (link_input == 'y' or link_input == 'Y'):
            raise ValueError

該当のリンクの抽出は以下の正規表現を使っています。

re.findall(r'\((https?://\S+)\)', content) + re.findall(r'<div class="wp-block-embed__wrapper">\s*(https?://\S+)\s*</div>', content)

WordPressでブログカードを作成した場合、<div class="wp-block-embed__wrapper">タグで囲まれた部分はブログカードになります。
ですので、ブログカードとしているリンクが抽出できるようにこのような正規表現にしました。

コードの解説

以下で、コードの各部分を詳しく解説します。

ファイルの読み込み

    with open(path, 'r', encoding='utf-8') as file:
        content = file.read()

この部分では、指定されたパス(path)のMarkdownファイルをUTF-8エンコーディングで開き、その内容を content 変数に読み込みます。

URLの抽出

    urls = re.findall(r'\((https?://\S+)\)', content) + re.findall(r'<div class="wp-block-embed__wrapper">\s*(https?://\S+)\s*</div>', content)

ここでは、正規表現を用いてMarkdownファイル内のURLを抽出しています。具体的には、次の2つの形式のURLが対象です:
– 丸括弧内に記載されたURL(例:[リンク](https://example.com)
– 特定の<div class="wp-block-embed__wrapper">タグ内に記載されたURL(WordPressの埋め込みブロック形式)

URLの存在確認

    link_check = True
    for url in urls:
        try:
            response = requests.get(url, allow_redirects=True, timeout=5)
            link_check = False
            print(f"URL does not exist: {url} in {path}")
        except requests.RequestException as e:
            link_check = False
            print(f"Error checking URL: {url} in {path} - {e}")

ここでは、抽出した各URLについてHTTPリクエストを送信し、そのレスポンスからURLの存在を確認します。
requests.get(url, allow_redirects=True, timeout=5) を使って、指定されたURLにアクセスします。
allow_redirects=True は、リダイレクトを許可する設定です。
timeout=5 は、5秒間応答がない場合にタイムアウトとする設定です。
– URLが存在しない場合やリクエストエラーが発生した場合は、エラーメッセージを表示し、link_checkFalseに設定します。

ユーザーへの確認

    if link_check == False:
        link_input = input('リンクが正しくない部分があります。続けますか?(y)')
        if not (link_input == 'y' or link_input == 'Y'):
            raise ValueError

すべてのURLが有効でない場合、ユーザーに処理を続けるかどうかを確認します。
inputでユーザーに対して「続けますか?」と確認し、yまたはYと答えた場合のみ続行します。それ以外の入力があった場合、ValueErrorを発生させて処理を中断します。

このスクリプトは、Markdownファイル内のリンクが有効かどうかを確認するために非常に便利です。特に、複数のリンクが含まれている場合、手動で確認する手間を省くことができます。スクリプトはリンクが無効な場合には確認メッセージを出すようにしています。

この関数を使うことで、記事のリンクが正しくないという事態を減らすことができます。

タイトルとURLをコピーしました