seleniumで要素を検索する際に使うのがfind_elementとfind_elementsメソッドです。
名前のよく似ている2つですが、スクレイピングをする際には各メソッドの違いについて理解して使い分ける必要があります。
そこで今回はfind_elementとfind_elementsメソッドの違いと使い方について解説します。
find_elementとfind_elements
find_elementメソッドとfind_elementsメソッドの違い
はじめにfind_elementとfind_elementsメソッドの違いがよく分かっていないという方に対して簡単に2つの違いを整理しておきます。
find_elementメソッド:引数に与えた検索条件に当てはまるもののうち、はじめの1つを返り値として返す
find_elementsメソッド:引数に与えた検索条件に当てはまるもの全てをリスト型で返す
find_elementメソッドとfind_elementsメソッドの返り値は以下のような中身になっています。
<selenium.webdriver.remote.webelement.WebElement (session="5518953ec76664b9835520bf8cfd43aa", element="6C33BE2A2EBB199146231E1C1814F4D4_element_2")>
[<selenium.webdriver.remote.webelement.WebElement (session="5518953ec76664b9835520bf8cfd43aa", element="6C33BE2A2EBB199146231E1C1814F4D4_element_2")>, <selenium.webdriver.remote.webelement.WebElement (session="5518953ec76664b9835520bf8cfd43aa", element="6C33BE2A2EBB199146231E1C1814F4D4_element_4")>, <selenium.webdriver.remote.webelement.WebElement (session="5518953ec76664b9835520bf8cfd43aa", element="6C33BE2A2EBB199146231E1C1814F4D4_element_5")>]
長いので見づらいですがfind_elementメソッドの返り値がオブジェクト要素1つなのに対し、find_elementsメソッドの返り値ではオブジェクト要素のリスト型になっていることが確認できます。
サンプルコードを通して違いを確認
上記の解説だけで各違いについて掴みづらいと思うので、実際のサンプルコードを通して確認してみましょう。
今回は下記のようなbodyの中身が”h3タグ”と3つの”li”タグだけの簡単なHTMLソースを扱います。
<body>
<h3>サンプルコード</h3>
<li>アップル</li>
<li>オレンジ</li>
<li>ピーチ</li>
</body>
次に示す例では各メソッドを使って上記HTMLソースの”li”要素を取得します。
find_elementメソッド
sample = driver.find_element(By.TAG_NAME, "li")
print(sample.text)
アップル
先述の通り、find_elementメソッドでは検索条件(今回はタグ”li”)に当てはまるもののうち、はじめの一つを返り値として返します。
今回のHTMLソースで一番はじめに出てくる”li”要素の中身は「アップル」なので、2行目のprint(sample_li.text)コマンドを実行すると「アップル」が出力されます。
find_elementsメソッド
sample = driver.find_elements(By.TAG_NAME, "li")
for i in sample:
print(i.text)
アップル
オレンジ
ピーチ
find_elementsメソッドでは検索条件に当てはまるものをリスト型で返します。そのため、返り値の中身を確認するためにfor文を使ってリスト内の要素を順番に参照しています。
参照したi番目の要素の中身をprint(i.text)で出力すると、「アップル」、「オレンジ」、「ピーチ」とHTMLソースの”li”項目を全て出力することができました。
もしリスト内の特定の要素を取得したいときは、リスト番号を添字で与えることで対応することができます。
sample = driver.find_elements(By.TAG_NAME, "li")
print(sample[1].text)
オレンジ
エラー対策
ここまで各メソッドの違いについて確認してきましたが、ここではエラー対策について触れておきます。
というのも実際のサイトをスクレイピングする際に意図した要素を取得できなかった場合、それ以降に実行するコードに影響を及ぼします。
そのため、各メソッドを使う場合にはエラー対策をする必要があります。
find_elementメソッドの場合
いきなりですが、find_elementメソッドの場合はエラー対策をすることができません。
find_elementでは探したい要素が見つからなかった時点で以下のようなエラー文を吐いて、プログラムが強制終了します。
Traceback (most recent call last):
・・・・・・・
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"tag name","selector":"h3"}
(Session info: chrome=114.0.5735.133); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception
Stacktrace:
・・・・・・・
そのためHTMLソースが変わる可能性のあるサイトをスクレイピングする場合にはfind_elementメソッドは使わない方が無難です。
find_elementsメソッド
find_elementメソッドでは検索条件を満たすものが見つからなかった場合は空リストを返します。
そのため返り値のリスト長を調べることでエラー対策をすることができます。
sample = driver.find_elements(By.TAGNAME, "p")
if len(sample) == 0:
print("要素が見つかりませんでした。")
まとめ
今回はfind_elementとfind_elementsメソッドの各違いについてサンプルコードと共に解説しました。
この記事で不明な点や気になるところがあれば下のコメント欄までお願いします。それではまた!
コメント