【Python】Seleniumで要素のテキスト・属性値・HTMLを取得する

目次

概要

Seleniumで特定したHTML要素(WebElement)から、ブラウザ上に表示されている「テキスト」や、HTMLタグ内に設定されている「属性値(href, src, idなど)」、さらには要素前後の「HTMLソース」を抽出する方法を解説します。

スクレイピングにおいて、データの中身を取り出すための最も重要な工程です。

仕様(入出力)

  • 入力: find_element 等で取得済みの WebElement オブジェクト
  • 出力: 抽出された文字列(テキスト、URL、HTMLコードなど)
  • 前提: Selenium WebDriverが正常に動作していること。

基本の使い方

要素のテキストと、リンク先URL(href属性)を取得する基本パターンです。

# element = driver.find_element(...)

# 1. 表示テキストの取得
# タグに囲まれた文章を取得します
print(f"テキスト: {element.text}")

# 2. 属性値の取得
# <a href="https://..."> の "https://..." 部分を取得
link_url = element.get_attribute("href")
print(f"リンクURL: {link_url}")

コード全文

HTMLのデータ属性(data-price等)や、要素内部のHTMLソース(innerHTML)を取得する実用的なデモコードです。

動作確認用に data: スキームを使用して、その場で簡易HTMLページを生成して読み込ませています。

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

def extract_element_info():
    """
    要素からテキスト、属性、HTMLソースを抽出するデモ関数。
    """
    driver = webdriver.Chrome()

    # テスト用のHTMLコンテンツ(商品カードを模した構造)
    # <div id="product-card" class="item" data-id="999" data-price="1500">
    #     <h2 class="title">Official Python T-Shirt</h2>
    #     <a href="/buy/999">Buy Now</a>
    # </div>
    html_content = """
    data:text/html;charset=utf-8,
    <div id='product-card' class='item' data-id='999' data-price='1500'>
        <h2 class='title'>Official Python T-Shirt</h2>
        <a href='/buy/999'>Buy Now</a>
        <span style='display:none'>Hidden Info</span>
    </div>
    """

    try:
        # 1. ページを開く
        driver.get(html_content)
        
        # 2. 対象の要素を特定(親要素: product-card)
        card_element = driver.find_element(By.ID, "product-card")

        print("--- 基本情報 ---")
        # .text プロパティ
        # 子要素のテキストもまとめて取得されますが、非表示要素(display:none)は除外されます
        print(f"[text] 表示テキスト:\n{card_element.text}")

        print("\n--- 属性の取得 ---")
        # .get_attribute(属性名)
        product_id = card_element.get_attribute("data-id")
        price = card_element.get_attribute("data-price")
        class_name = card_element.get_attribute("class")
        
        print(f"[data-id]    : {product_id}")
        print(f"[data-price] : {price}")
        print(f"[class]      : {class_name}")

        print("\n--- HTMLソースの取得 ---")
        # innerHTML: 要素の中身(タグ含む)を取得
        inner = card_element.get_attribute("innerHTML")
        print(f"[innerHTML]: {inner.strip()}")
        
        # outerHTML: 要素自身を含む完全なHTMLを取得
        outer = card_element.get_attribute("outerHTML")
        print(f"[outerHTML]: {outer.strip()}")

    finally:
        driver.quit()

if __name__ == "__main__":
    extract_element_info()

カスタムポイント

プロパティとメソッドの対応表

Seleniumの WebElement オブジェクトが持つ主要なプロパティとメソッドです。

構文種類取得できる内容具体例
element.textプロパティ要素内の表示されているテキストTop Page
element.get_attribute("href")メソッドリンク先のURLhttps://example.com
element.get_attribute("src")メソッド画像やスクリプトのソースURLimg/logo.png
element.get_attribute("value")メソッド入力フォームに入力されている値MyPassword123
element.get_attribute("innerHTML")メソッド要素の開始タグと終了タグの間にあるHTML<span>Text</span>
element.get_attribute("outerHTML")メソッド要素自身を含む完全なHTML<div><span>Text</span></div>

注意点

  1. textプロパティの罠(非表示要素)
    • element.text は、ブラウザ上でユーザーに見えているテキストのみを返します。
    • CSSで display: none;visibility: hidden; が適用されている要素のテキストは空文字になります。
    • 非表示テキストも取得したい場合は element.get_attribute("textContent") を使用してください。
  2. 属性が存在しない場合
    • 指定した属性がHTMLタグに記述されていない場合、get_attribute()None を返します。エラーにはなりませんが、その後の処理(文字列操作など)でエラーにならないよう注意が必要です。
  3. URLの補完
    • hrefsrc 属性を取得する場合、HTMLソース上では相対パス(/page/1)であっても、Seleniumは自動的に絶対URL(http://site.com/page/1)に変換して返す場合があります(ブラウザの挙動に依存)。

応用

テーブル(表)データをリスト形式で一括取得する応用例です。

from selenium import webdriver
from selenium.webdriver.common.by import By

def scrape_table_data():
    driver = webdriver.Chrome()
    # サンプルテーブル
    driver.get("data:text/html;charset=utf-8,<table><tr><td>Apple</td><td>100</td></tr><tr><td>Orange</td><td>50</td></tr></table>")

    try:
        # trタグ(行)を全て取得
        rows = driver.find_elements(By.TAG_NAME, "tr")
        
        data_list = []
        for row in rows:
            # 各行の中のtdタグ(セル)を取得
            cells = row.find_elements(By.TAG_NAME, "td")
            
            # テキストを抽出してリスト化
            # [Apple, 100], [Orange, 50] のような形にする
            row_data = [cell.text for cell in cells]
            data_list.append(row_data)

        print(f"抽出データ: {data_list}")

    finally:
        driver.quit()

if __name__ == "__main__":
    scrape_table_data()

まとめ

  • 見た目の文字が欲しいなら element.text
  • 裏側の設定値(URL、ID、フォーム入力値)が欲しいなら element.get_attribute("属性名")
  • HTML構造そのものが欲しいなら element.get_attribute("outerHTML")

この3つを使い分けることで、Webページ上のあらゆる情報をPythonに取り込むことができます。

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

この記事を書いた人

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

目次