目次
概要
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") | メソッド | リンク先のURL | https://example.com |
element.get_attribute("src") | メソッド | 画像やスクリプトのソースURL | img/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> |
注意点
- textプロパティの罠(非表示要素)
element.textは、ブラウザ上でユーザーに見えているテキストのみを返します。- CSSで
display: none;やvisibility: hidden;が適用されている要素のテキストは空文字になります。 - 非表示テキストも取得したい場合は
element.get_attribute("textContent")を使用してください。
- 属性が存在しない場合
- 指定した属性がHTMLタグに記述されていない場合、
get_attribute()はNoneを返します。エラーにはなりませんが、その後の処理(文字列操作など)でエラーにならないよう注意が必要です。
- 指定した属性がHTMLタグに記述されていない場合、
- URLの補完
hrefやsrc属性を取得する場合、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に取り込むことができます。
