はじめに
PythonでSeleniumを使ってWebスクレイピングのプログラムを作成し、依頼者のパソコンで動作確認を行ったところ、要素の取得部分でエラーが発生しました。
具体的には、.find_element_by_id()
などのメソッドでエラーが出てしまい、正常に動作しませんでした。
本記事では、その原因と対応方法について、実際の経験をもとにまとめました。
原因:Seleniumのバージョンが異なる
結論から申し上げますと、私の開発環境では「Selenium 3」を使用していたのに対し、依頼者の環境では「Selenium 4」がインストールされていたため、バージョン間の構文の違いが原因でエラーが発生していました。
Selenium 4では、要素を取得するための記述方法が大きく変更されています。Selenium 3で使用されていたfind_element_by_id()
やfind_element_by_name()
などのメソッドは、Selenium 4では非推奨(もしくは廃止)となっています。
Seleniumのバージョンを確認する方法
まずは、使用しているSeleniumのバージョンを確認します。
- コマンドプロンプトまたはターミナルを開きます。
- Pythonインタプリタを起動します(
python
またはpython3
と入力)。 - 以下のコードを実行します。
import selenium
print(selenium.__version__)
これで、インストールされているSeleniumのバージョンが確認できます。
Selenium 3とSelenium 4の構文の違い
以下に、バージョンによる要素取得の記述の違いを示します。
IDで要素を取得する場合
- Selenium 3の場合: pythonコピーする編集する
driver.find_element_by_id("xxxx")
- Selenium 4の場合: pythonコピーする編集する
from selenium.webdriver.common.by import By driver.find_element(By.ID, "xxxx")
NAMEで要素を取得する場合
- Selenium 3の場合: pythonコピーする編集する
driver.find_element_by_name("xxxx")
- Selenium 4の場合: pythonコピーする編集する
from selenium.webdriver.common.by import By driver.find_element(By.NAME, "xxxx")
Selenium 4では、.find_element_by_xxx()
形式のメソッドはすべて廃止され、代わりにBy
クラスを使った新しい構文が採用されています。構文の違いに気付かず旧式の書き方をしてしまうと、正常に動作しなくなります。
補足:他の属性による要素取得
IDやNAME以外にも、クラス名、CSSセレクタ、XPathなどを使用して要素を取得する方法があります。Selenium 4ではこれらもすべてBy
を使って記述します。
例:
driver.find_element(By.CLASS_NAME, "xxx")
driver.find_element(By.XPATH, "//div[@id='xxx']")
詳細は公式ドキュメントや最新のライブラリ仕様をご確認いただくのが確実です。
おわりに
Seleniumを使ったスクレイピングでは、バージョンの違いが思わぬエラーの原因になることがあります。動作環境を確認し、バージョンに合った構文で記述することが重要です。
本記事が同じようなエラーでお困りの方の参考になれば幸いです。
最後までお読みいただき、ありがとうございました。