目次
概要
Selenium 4.x以降の標準的な方法である find_element メソッドと By クラスを使用して、Webページ上の特定のHTML要素(ボタン、入力欄、見出し等)を取得する方法を解説します。
ID、クラス名、タグ名だけでなく、より柔軟なCSSセレクタやXPathによる指定方法も網羅します。
仕様(入出力)
- 入力:
- 検索条件(
By.ID,By.XPATH等) - 検索値(ID名、XPath文字列など)
- 検索条件(
- 出力:
WebElementオブジェクト(見つかった場合)NoSuchElementException(見つからなかった場合)
- 前提:
from selenium.webdriver.common.by import Byのインポートが必須。
基本の使い方
最も高速で信頼性の高い ID 属性を使って要素を1つ取得する基本パターンです。
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com") # テスト用ページ
# id="my-button" を持つ要素を取得
element = driver.find_element(By.ID, "my-button")
# テキストを表示
print(element.text)
driver.quit()
コード全文
様々なロケータ(検索方法)を使って要素を取得し、その情報を出力する完全な実装例です。
※動作確認用に、ローカルにサンプルHTMLファイルがあることを想定したパス指定にしています。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
import os
def extract_elements_demo():
"""
ID, Class, Tag, CSS Selector, XPath を使用して
HTML要素を取得するデモ関数です。
"""
driver = webdriver.Chrome()
# 動作確認用のHTMLファイルパス(環境に合わせて書き換えてください)
# ここでは例として example.com を使用します
target_url = "https://example.com"
try:
driver.get(target_url)
print(f"Page Title: {driver.title}\n")
# 1. IDで取得 (By.ID)
# ページ内に一意なIDがある場合に最適
try:
el_id = driver.find_element(By.ID, "header-id")
print(f"[ID] Text: {el_id.text}")
except NoSuchElementException:
print("[ID] 指定されたIDの要素は見つかりませんでした。")
# 2. クラス名で取得 (By.CLASS_NAME)
# 複数の要素が同じクラスを持つ場合、最初に見つかった1つを返します
try:
el_class = driver.find_element(By.CLASS_NAME, "content-class")
print(f"[Class] Text: {el_class.text}")
except NoSuchElementException:
print("[Class] 指定されたClassの要素は見つかりませんでした。")
# 3. タグ名で取得 (By.TAG_NAME)
# <h1>, <p>, <div> などのタグ名で検索
el_tag = driver.find_element(By.TAG_NAME, "h1")
print(f"[Tag] H1 Text: {el_tag.text}")
# 4. CSSセレクタで取得 (By.CSS_SELECTOR)
# ID, Class, 属性などを組み合わせた柔軟な指定が可能
# 例: divタグの中にある pタグ
el_css = driver.find_element(By.CSS_SELECTOR, "div > p")
print(f"[CSS] Text: {el_css.text}")
# 5. XPathで取得 (By.XPATH)
# 階層構造やテキスト内容など、最も複雑な条件で検索可能
# 例: html/body/div/h1 という絶対パス的な指定
el_xpath = driver.find_element(By.XPATH, "/html/body/div/h1")
print(f"[XPath] Text: {el_xpath.text}")
except Exception as e:
print(f"予期せぬエラー: {e}")
finally:
driver.quit()
if __name__ == "__main__":
extract_elements_demo()
カスタムポイント
Byクラスの属性一覧
find_element の第一引数に指定する By クラスの主要な属性と意味です。
| 属性 (By.XXX) | 意味 | HTML例 / 指定例 | 特徴 |
By.ID | id属性で検索 | <div id="login">By.ID, "login" | 最速・推奨。ページ内で一意であるはずのため特定しやすい。 |
By.CLASS_NAME | class属性で検索 | <div class="btn">By.CLASS_NAME, "btn" | 複合クラス(btn primary)の場合は一部だけ指定するとエラーになることがある。 |
By.TAG_NAME | タグ名で検索 | <h1>Title</h1>By.TAG_NAME, "h1" | 該当要素が多い場合、リスト取得(find_elements)向き。 |
By.NAME | name属性で検索 | <input name="user">By.NAME, "user" | フォーム要素(input, select等)の特定によく使われる。 |
By.CSS_SELECTOR | CSSセレクタで検索 | <div id="a"><p>...By.CSS_SELECTOR, "#a > p" | IDやClassを組み合わせたスタイリッシュな記述が可能。 |
By.XPATH | XPathで検索 | <div><span>Text</span>By.XPATH, "//div/span" | 構造やテキストの中身(text()='次へ')でも検索できる最強の指定方法。 |
注意点
- 要素が見つからない場合
- 条件に一致する要素がないと、
NoSuchElementExceptionエラーが発生してプログラムが停止します。 - 存在確認をする場合は
try-exceptで囲むか、後述のfind_elements(複数形)を使います。
- 条件に一致する要素がないと、
- 複数形との違い
find_element(単数): 最初に見つかった1つの要素を返します。なければエラー。find_elements(複数): 見つかった全ての要素をリストで返します。なければ空のリスト[]を返すため、エラーになりません。
- 複合クラスの罠
<div class="btn btn-primary">のようにスペースで区切られたクラスの場合、By.CLASS_NAMEに"btn btn-primary"と書くとエラーになることがあります。- その場合は CSSセレクタ
By.CSS_SELECTOR, ".btn.btn-primary"を使うのが正解です。
応用
要素そのものではなく、要素の「属性値(リンク先など)」を取得する例です。
from selenium import webdriver
from selenium.webdriver.common.by import By
def get_attribute_value():
driver = webdriver.Chrome()
driver.get("https://www.google.com")
# 検索ボタン要素をCSSセレクタ(inputタグのname属性がbtnK)で特定
# 注意: Googleのページ構造は変わる可能性があります
try:
search_input = driver.find_element(By.NAME, "q")
# inputタグに入力されている値を取得には 'value' 属性を見る
input_value = search_input.get_attribute("value")
print(f"現在の入力値: {input_value}")
# リンク要素(aタグ)からURL(href)を取得する例
# link = driver.find_element(By.TAG_NAME, "a")
# print(link.get_attribute("href"))
finally:
driver.quit()
if __name__ == "__main__":
get_attribute_value()
まとめ
Seleniumでの要素取得は driver.find_element(By.xxx, “値”) が基本構文です。
基本的には一意に定まる By.ID を優先し、IDがない場合は By.CSS_SELECTOR や By.XPATH を活用してターゲットを絞り込んでください。
