はじめに
Python+seleniumでスクレイピングをしているときにエラーになりました。
今回はその時に発生したエラーについてです。
このエラーはseleniumを使った事がある人は必ず1度は目にした事があるエラーと思いますので、その原因と対処法について書くことにしました。
エラーの原因と対処方法
発生したエラー
まずは発生したエラーですが
AttributeError: 'WebDriver' object has no attribute 'find_element_by_class_name'
というものでした。
日本語に訳すと
「AttributeError: ‘WebDriver’ オブジェクトには ‘find_element_by_class_name’ 属性がありません」
という意味になります。
使おうとしているWebDriverには ‘find_element_by_class_name’なんてないよと言っています。
エラーの原因と対処法の例
このエラーメッセージは、’WebDriver’ オブジェクトに ‘find_element_by_class_name’ という名前のメソッドまたは属性が存在しないときに発生します。
これはWebDriverのバージョンアップに伴いfind_element_by_class_nameが使えなくなったからです。
サンプルプログラム
エラーが出るプログラム
次の例はエラーが発生する例です。
Googleのサイトからclass名”MV3Tnb”のテキストを取得しようとしています。
from selenium import webdriver
# WebDriver のインスタンスを作成
driver = webdriver.Chrome()
driver.get('https://www.google.com/?hl=ja')
# クラス名を指定して要素を抽出
element = driver.find_element_by_class_name('MV3Tnb')
# 要素のテキストを表示
print(element.text)
# WebDriverを閉じる
driver.quit()
これを実行すると
AttributeError: 'WebDriver' object has no attribute 'find_element_by_class_name'
というようにエラーが発生します。
修正したプログラム
次に修正を行ったプログラムです。
find_element_by_class_nameの代わりにelement = driver.find_elementを使用します。
引数も1つから2つに変更されました。
from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriver のインスタンスを作成
driver = webdriver.Chrome()
driver.get('https://www.google.com/?hl=ja')
# クラス名を指定して要素を抽出
element = driver.find_element(By.CLASS_NAME, "MV3Tnb")
# 要素のテキストを表示
print(element.text)
# WebDriverを閉じる
driver.quit()
2行目でByをインポートしています。
例ではCLASS_NAMEを取得していますが、他にもidやx_pathなどもあります。
(詳しくは定義をみてください。シンプルでわかると思います)
これを実行すると
Googleについて
とClassからテキストが取得できている事がわかります。
さいごに
今回はWebDriverの仕様変更によって使えなくなったメソッドを使ったために発生したエラーでした。
参考にする書籍やページによると内容が古い事があるのでこのエラーに出くわすかと思います。
この記事がお役に立ったのなら嬉しいです。
最後までお読みいただきありがとうございます。