Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonの正規表現でWebページ内のすべてのアンカータグ(タグ)を抽出する方法

WebスクレイピングやHTML解析を行う際、ページ内に含まれるすべてのアンカー(<a>)タグを取り出したいケースはよくあります。Pythonでは標準ライブラリのreモジュールを使えば、正規表現だけで簡単に抽出できます。

基本的なアンカータグの抽出方法

次のコードは、文字列中に含まれるすべてのアンカータグ全体を<a></a>の単位で取得する例です。

import re

html = "this is text1 <a href='irawati.com' target='_blank'>hi</a> this is text2"

# アンカータグ全体を抽出するパターン
pattern = re.compile(r"<a\s[^>]*>.*?</a>", re.S)

result = pattern.findall(html)
print(result)

実行結果

["<a href='irawati.com' target='_blank'>hi</a>"]

この正規表現のポイントは以下の通りです。

  • <a\s<a の直後に空白が続く要素(アンカータグ)だけにマッチさせます。
  • [^>]*>:タグの終わりの > までの属性部分をまとめて取得します。
  • .*?:最小一致(lazy match)にすることで、複数のタグがあっても1つずつ正しく区切って抽出できます。
  • re.S:改行を含むHTMLにも対応させるフラグです。

href属性(リンク先URL)だけを取り出す場合

タグ全体ではなく、リンク先のURLだけが必要な場合は、キャプチャグループ () を使います。

import re

html = """
<a href='https://example.com'>リンク1</a>
<a href='https://sample.org'>リンク2</a>
"""

pattern = re.compile(r"<a\s+href=['\"]([^'\"]+)['\"]")

urls = pattern.findall(html)
print(urls)

実行結果

['https://example.com', 'https://sample.org']

より堅牢に処理したい場合

正規表現は手軽ですが、属性の順序が変わる・タグが入れ子になるなどの実際のHTMLでは崩れることがあります。実務では、HTMLパーサー専用ライブラリのBeautifulSoupを使うのがおすすめです。

from bs4 import BeautifulSoup

html = "<a href='irawati.com' target='_blank'>hi</a>"
soup = BeautifulSoup(html, "html.parser")

for a in soup.find_all("a"):
    print(a.get("href"))

簡単なテキスト処理には正規表現、本格的なHTML解析にはBeautifulSoup、という使い分けが効率的です。

  1. 【Python】正規表現で文字列の末尾にマッチさせる方法

    文字列の末尾にマッチさせるには Pythonのreモジュールを使うと、正規表現によって文字列の末尾にある特定のパターンを簡単に抽出できます。文字列の最後に一致させるには、正規表現のメタ文字である $ を使用します。 $ は「文字列の終わり」を表す特殊文字です。パターンの末尾にこの記号を付けることで、文字列の最後にある単語だけをマッチさせることができます。 以下のコードでは、文字列「cheer leaders at the football stadium」の末尾にある単語「stadium」をマッチさせています。 コード例 import re s = cheer leaders at the

  2. Pythonで正規表現を使って文字列の先頭にマッチさせる方法

    正規表現では、^(キャレット)というメタ文字を使うことで、文字列の先頭にマッチさせることができます。この記号は、パターンが対象となる文字列の冒頭から始まる場合にのみ一致することを意味します。例えば、次のコードは文字列「cheer leaders at the football stadium」の先頭にある単語「cheer」を抽出して表示します。コード例import re s = cheer leaders at the football stadium result = re.search(r^\w+, s) print(result.group())ここで使用しているパターン r^\w+