Pythonを用いたWebブラウザ自動操作において、特定の要素から情報を抽出する作業は非常に頻繁に発生します。
Webサイト上のリンク先URLを取得したり、画像のソースを確認したりするためには、Seleniumの「get_attribute」メソッドを使いこなすことが不可欠です。
この記事では、PythonのSeleniumライブラリを使用して、HTML要素の属性値、特に「href」を取得する具体的な方法を詳しく解説します。
初心者の方でも迷わずに実装できるよう、基本の書き方から実務で役立つ応用テクニックまでを網羅的にまとめました。
スクレイピングやテスト自動化の現場で即戦力となる知識を、ぜひこの記事を通じて習得してください。
Seleniumのget_attributeメソッドとは
Seleniumにおけるget_attributeは、HTML要素(WebElement)が持つ特定の属性値を取得するためのメソッドです。
HTMLのタグには、idやclass、href、srcなど、さまざまな属性が付与されています。
これらの情報をプログラム側で読み取ることで、動的なサイト分析やデータの収集が可能になります。
たとえば、検索結果の一覧からすべてのリンクを抽出したい場合、各アンカータグのhref属性を取得する必要があります。
また、ボタンの状態が有効か無効かを判定するために、disabled属性を確認するといった用途にも活用されます。
Selenium 4以降では、プロパティと属性の区別がより明確になりましたが、依然としてget_attributeは最も汎用性の高い手段として広く使われています。
get_attributeの基本的な構文
get_attributeメソッドの使い方は非常にシンプルです。
まずは対象となる要素をfind_elementなどのメソッドで特定し、そのオブジェクトに対してメソッドを呼び出します。
# 基本的な使い方のイメージ
element = driver.find_element(By.ID, "example-id")
attribute_value = element.get_attribute("属性名")
引数には、取得したい属性の名前を文字列で指定します。
もし指定した属性が存在しない場合は、None(Pythonの空値)が返されるという点に注意してください。
href属性を取得する具体的な手順
Webスクレイピングにおいて最も需要が高いのが、<a>タグからリンク先URL(href)を取得する操作です。
ここからは、実際にブラウザを起動してリンクを取得する一連の流れをコードとともに見ていきましょう。
単一のリンクを取得する方法
特定のIDを持つリンクから、その遷移先URLを取得するコード例は以下の通りです。
from selenium import webdriver
from selenium.webdriver.common.by import By
# ブラウザの初期化
driver = webdriver.Chrome()
# テスト対象のサイトへアクセス
driver.get("https://example.com")
# IDを指定して要素を取得
link_element = driver.find_element(By.ID, "sample-link")
# href属性の値を取得
url = link_element.get_attribute("href")
print(f"取得したURL: {url}")
# ブラウザを閉じる
driver.quit()
このコードを実行すると、コンソールには指定した要素のリンク先がフルパスで表示されます。
取得したURL: https://example.com/target-page
相対パスと絶対パスの扱いに注意
HTMLソース上ではリンクが相対パス(例:/contact)で記述されていることがよくあります。
しかし、Seleniumのget_attribute("href")を使用すると、自動的に絶対パス(例:https://example.com/contact)に変換された状態で取得されます。
これはブラウザの標準的な挙動をSeleniumが再現しているためです。
もしHTMLに記述されているそのままの文字列(相対パスなど)を取得したい場合は、後述するget_dom_attributeの使用を検討してください。
href以外の属性値を取得する活用例
get_attributeは、リンク以外にもあらゆる属性に対して有効です。
ここでは、実務でよく使われる属性取得のパターンをいくつか紹介します。
画像のソースURL(src)を取得する
Webサイト上の画像をダウンロードしたい場合や、正しく画像が表示されているか確認する場合にsrc属性を取得します。
# 画像要素を取得
image_element = driver.find_element(By.TAG_NAME, "img")
# src属性を取得
image_url = image_element.get_attribute("src")
print(f"画像のURL: {image_url}")
画像タグには多くの場合、alt属性(代替テキスト)も設定されているため、これらを組み合わせて取得することで、より詳細なデータ収集が可能になります。
入力フォームの値(value)を取得する
テキストボックスに入力されている現在の値を取得するには、value属性を指定します。
これは、自動テストで入力内容が正しいか検証する際に非常に重要です。
# 入力フォームを取得
search_box = driver.find_element(By.NAME, "q")
# 現在入力されている値を取得
current_text = search_box.get_attribute("value")
なお、要素内に記述されているテキスト(タグで囲まれた文字)を取得する場合は、.textプロパティを使用しますが、input要素などの入力値はget_attribute(“value”)でしか取得できないので注意が必要です。
クラス名(class)やID(id)を取得する
動的に変化するUIの状態を把握するために、クラス名を取得して条件分岐を行うことがあります。
# 要素を取得
element = driver.find_element(By.CSS_SELECTOR, ".menu-item")
# クラス名を取得
class_names = element.get_attribute("class")
if "active" in class_names:
print("このメニューは現在アクティブです")
Selenium 4の新機能:get_dom_attributeとの違い
Selenium 4からは、新しくget_dom_attributeというメソッドが登場しました。
従来のget_attributeとの違いを理解しておくことで、より正確なスクレイピングが可能になります。
| メソッド名 | 取得できる内容 | 特徴 |
|---|---|---|
| get_attribute | 計算後の属性値(プロパティ含む) | hrefを絶対パスで返す、現在の状態を反映する |
| get_dom_attribute | HTMLソース上の記述そのまま | hrefを相対パスのまま返す、初期値を優先する |
たとえば、HTML上に <a href="/home" id="link"> と書かれている場合を考えます。
get_attribute("href") は “https://example.com/home” を返します。
一方で get_dom_attribute("href") は “/home” をそのまま返します。
用途に応じて、加工された値が必要ならget_attributeを、元の記述が必要ならget_dom_attributeを選択してください。
実践例:ページ内の全リンクをリストアップする
個別の要素だけでなく、ページ内に存在するすべてのリンクを一括で取得する実践的なプログラムを作成してみましょう。
以下のコードは、ページ内の全アンカータグを探し、それぞれのhrefとリンクテキストを表示するものです。
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://news.google.co.jp") # 例としてニュースサイト
# 全てのaタグを取得
all_links = driver.find_elements(By.TAG_NAME, "a")
link_data = []
for link in all_links:
# href属性を取得
url = link.get_attribute("href")
# リンク内のテキストを取得
text = link.text
# リンクが空でない場合のみリストに追加
if url:
link_data.append({"text": text, "url": url})
# 取得したデータを一部表示
for item in link_data[:10]:
print(f"見出し: {item['text']} | URL: {item['url']}")
driver.quit()
このスクリプトを使えば、特定のニュースサイトやブログのURLリストを瞬時に作成できます。
大量の要素を扱う場合は、要素が見つかるまで待機する「Explicit Wait(明示的な待機)」を併用すると、エラーの少ない安定したプログラムになります。
よくあるトラブルと解決策
get_attributeを使用する際、初心者が陥りやすいポイントがいくつかあります。
属性値が取得できずにNoneが返ってくる
取得結果がNoneになる場合、そもそも指定した属性名が間違っているか、要素の読み込みが完了していない可能性があります。
特にidやclassのタイポ(打ち間違い)には注意してください。
また、JavaScriptによって後から付与される属性の場合、要素が完全に描画されるまで待機する必要があります。
要素が画面外にあり取得できない
Seleniumのいくつかのメソッドは要素が画面内にないと失敗することがありますが、get_attribute自体は要素がDOM上に存在していれば、非表示の状態でも値を取得することが可能です。
ただし、要素自体がfind_elementで見つからない場合は、スクロール処理や待機処理を入れてください。
カスタムデータ属性(data-*)の取得
HTML5でよく使われるdata-idやdata-categoryといった独自属性も、get_attributeで取得できます。
# <div data-user-id="12345">...</div> の場合
user_id = element.get_attribute("data-user-id")
フロントエンドのフレームワーク(ReactやVue.jsなど)を使用しているサイトでは、これらの属性に重要なデータが格納されていることが多いため、積極的に活用しましょう。
まとめ
Python Seleniumのget_attributeメソッドは、Webサイトから情報を引き出すための最も基本的かつ強力なツールの1つです。
本記事では、特に利用頻度の高いhref属性の取得を中心に、他の属性やSelenium 4での新しいメソッドとの違いについても解説しました。
hrefを取得すると絶対パスが返される性質や、input要素の入力値取得にはvalue属性を指定する点などは、実際の開発で非常に重要なポイントとなります。
まずはシンプルなリンク取得から始め、徐々に複雑な属性操作や全要素のループ処理へとステップアップしていきましょう。
正確に属性値を取得できるスキルを身につければ、Webスクレイピングや自動テストの幅は飛躍的に広がります。
今回学んだ内容を、ぜひ皆さんのプロジェクトに役立ててください。
