今回の内容
ここまでの内容で基本的な投稿はできるようになりました。
今回は、追加的な機能として、記事の内部にある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_check
をFalse
に設定します。
ユーザーへの確認
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ファイル内のリンクが有効かどうかを確認するために非常に便利です。特に、複数のリンクが含まれている場合、手動で確認する手間を省くことができます。スクリプトはリンクが無効な場合には確認メッセージを出すようにしています。
この関数を使うことで、記事のリンクが正しくないという事態を減らすことができます。