htmlのaタグ
のリンクを外部リンクで開くようにaタグ
を更新するpythonスクリプトを紹介します。
テキスト形式でhtmlを用意して、pythonスクリプトを実行すると自動でaタグ
の属性を更新してくれます。
aタグの属性の変更内容
次のようなデフォルト設定のaタグ
に属性を追加して、新規タブで開くように設定変更します。
<a href="リンクURL">リンク文字列<a>
下記のようにtarget属性
、rel属性
を追加します。
<a href="リンクURL" target="_blank" rel="noopener noreferrer">リンク文字列</a>
aタグ
の内容は次のような記事を参考にしています。
- 実はヤバい?aタグと別タブで開く(target=”_blank”)の使い方 | ホームページ制作 愛知 名古屋 |株式会社WWG ダブルダブルジー
- HTML のリンクを新しいタブで開くようにする方法
- 【HTML】基本のリンク&別タブでリンクを開くコードと注意点 | すきまのスキマ
aタグの属性変更pythonコード
次の処理を行うようなpythonコードを作成しています。
<a href="リンクURL">
を検索<a href="リンクURL" target="_blank" rel="noopener noreferrer">
に置換
正規表現を使えば、1.と2.を同時に行うことができますね。
次のサンプルhtmlを例に置換用スクリプトを作成していきます。
sample_html = '''
<p>Google検索へのリンク</p>
<p><a href="https://www.google.com/">Google</a></p>
<p>Yahooへのリンク</p>
<p><a href="https://www.yahoo.co.jp/">Yahoo!</a></p>'''.replace("\n","")
まずは、<a href="リンクURL">
にマッチする正規表現パターンを作成します。
import re
from pprint import pprint #結果の出力用
# 正規表現パターン
p = re.compile('''
<a.+? # <a にマッチ
href="(https?.*?)" # href=URLにマッチ⇒URLはグループ(\1)として抽出
.*?> # >にマッチ
''', re.VERBOSE)
# マッチの確認
p.search(sample_html)
# <re.Match object; span=(23, 57), match='<a href="https://www.google.com/">'>
p.findall(sample_html)
# ['https://www.google.com/', 'https://www.yahoo.co.jp/']
このとき、(https?.*?)
の部分は、\1
で置換時に参照できる点がポイントです。
続いて、このパターンを使用して、aタグ
に属性を追加するように置換しましょう。
sub("置換後の文字列", 置換される文字列全体)
これで、'置換される文字列全体'
からパターンを検索して、'置換後の文字列'
に置き換えできます。
res = p.sub('<a href="\\1" target="_blank" rel="noopener noreferrer">', sample_html)
pprint(res)
# ('<p>Google検索へのリンク(外部リンク)</p><p><a href="https://www.google.com/" '
# 'target="_blank" rel="noopener noreferrer">Google</a></p><p>内部リンク</p><p><a '
# 'href="https://www.yutaka-note.com/entry/data_analysis">内部リンク!</a></p>')
ここまでのコードをまとめると次のようになります。
import re
src_html = """
ここにhtmlを入力
"""
p = re.compile(r'''
<a.+? # <a にマッチ
href="(https?.*?)" # href=URLにマッチ⇒URLはグループ(\1)として抽出
.*?>' # >にマッチ
, re.VERBOSE''')
res = p.sub('<a href="\\1" target="_blank" rel="noopener noreferrer">', src_html)
res
【応用編】外部リンクのみaタグ変更
内部リンクの場合は、既存タブで開くようにすることも可能です。
正規表現のマッチ条件を変更して、内部リンクの場合は置換しないようにします。
次のように、URLのマッチ部分に否定先読みを埋め込みます。
'href=("?!内部リンクのドメイン.*")"(https?.*?)"
次のサンプルhtmlで挙動を確認してみましょう。
sample_html = '''
<p>Google検索へのリンク(外部リンク)</p>
<p><a href="https://www.google.com/">Google</a></p>
<p>内部リンク</p>
<p><a href="https://www.yutaka-note.com/entry/data_analysis">内部リンク!</a></p>
'''.replace("\n","")
内部リンクのドメインは、このブログのhttps://www.yutaka-note.com/
を指定します。
import re
p = re.compile('''
<a.+? # <a にマッチ
href=
(?!"https://www.yutaka-note.com/.*") # 否定先読みで内部リンク回避
"(https?.*?)" # href=URLにマッチ⇒URLはグループ(\1)として抽出
.*?> # >にマッチ
''', re.VERBOSE)
res = p.sub('<a href="\\1" target="_blank" rel="noopener noreferrer">', sample_html)
pprint(res)
# ('<p>Google検索へのリンク(外部リンク)</p><p><a href="https://www.google.com/" '
# 'target="_blank" rel="noopener noreferrer">Google</a></p><p>内部リンク</p><p><a '
# 'href="https://www.yutaka-note.com/entry/data_analysis">内部リンク!</a></p>')
内部リンクの方は、属性が追加されていないので既存タグで開かれます。
Pythonで作業を効率化する方法
今回はaタグ
に属性を追加して、リンクを新規タブで開くようにするPythonスクリプトを紹介しました。
pythonを使えば、簡単なスクリプトで作業を劇的に効率化することも可能です!
pythonの効率化関係で言えば、次の記事で紹介しているような本が自動化の本がおススメです。