【Python】SeleniumでHTML要素を取得する:ID・Class・XPath・CSSセレクタ

目次

概要

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.IDid属性で検索<div id="login">
By.ID, "login"
最速・推奨。ページ内で一意であるはずのため特定しやすい。
By.CLASS_NAMEclass属性で検索<div class="btn">
By.CLASS_NAME, "btn"
複合クラス(btn primary)の場合は一部だけ指定するとエラーになることがある。
By.TAG_NAMEタグ名で検索<h1>Title</h1>
By.TAG_NAME, "h1"
該当要素が多い場合、リスト取得(find_elements)向き。
By.NAMEname属性で検索<input name="user">
By.NAME, "user"
フォーム要素(input, select等)の特定によく使われる。
By.CSS_SELECTORCSSセレクタで検索<div id="a"><p>...
By.CSS_SELECTOR, "#a > p"
IDやClassを組み合わせたスタイリッシュな記述が可能。
By.XPATHXPathで検索<div><span>Text</span>
By.XPATH, "//div/span"
構造やテキストの中身text()='次へ')でも検索できる最強の指定方法。

注意点

  1. 要素が見つからない場合
    • 条件に一致する要素がないと、NoSuchElementException エラーが発生してプログラムが停止します。
    • 存在確認をする場合は try-except で囲むか、後述の find_elements(複数形)を使います。
  2. 複数形との違い
    • find_element (単数): 最初に見つかった1つの要素を返します。なければエラー。
    • find_elements (複数): 見つかった全ての要素をリストで返します。なければ空のリスト [] を返すため、エラーになりません。
  3. 複合クラスの罠
    • <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 を活用してターゲットを絞り込んでください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次