久しぶりにスクレイピングの勉強をしようと思い、SeleniumやWebDriverを最新のものにしようと調べていたところ下記の情報を目にしました。
Selenium4.6以降はドライバを、4.11以降はブラウザを(ブラウザがインストールされていない場合)自動でダウンロードされる。
従来はダウンロードサイトからドライバをダウンロードし、コードの中でパスを指定する必要があったため、「これは楽になる!」と早速ウキウキでSeleniumをアップグレードしました。
ところが以前までと同じようにコーディングした所、思わぬエラーに遭遇してしまいました。
突然の「AttributeError: 'WebDriver' object has no attribute」
Webスクレイピングの際、基本的にはHTMLの要素を取得し、操作することになります。
そこで以前スクレイピングを勉強した時と同様、下記のようにコードを記述しました。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('URL')
el = driver.find_element_by_class_name('XXX')
上記を実行した所、下記のエラー文が出力されました。
AttributeError: 'WebDriver' object has no attribute 'find_element_by_class_name'
「'WebDriver'は'find_element_by_class_name'という属性を持っていません」
いやいやいや…スクレイピングで必須のメソッドをSeleniumが持ってないはずないやん…
ということで調べてみましたが、結論はシンプルなものでした。
結論
結論としては、
「Selenium4以降では"find_element_by_"のメソッドは使えない」
というものでした。
※正確にはもっと細かいバージョンで使用不可になったのかもしれません。
従来のby_class_name
の部分はfind_element
の後ろの()
内に、第一引数としてBy.~の形で記述します。
そして従来のクラス名などに当たる部分を第二引数に記述します。
from selenium import webdriver
from selenium.webdriver.common.by import By # Byの定義の為に追加
driver = webdriver.Chrome()
driver.get('URL')
el = driver.find_element(By.CLASS_NAME, 'XXX') # この部分を4系の書き方に修正
これでエラーを解消することができました。
今回当たったエラー以外に、他にも色々と変わっているのかもしれません。
最後に
プログラミングの世界は日々変化していき、新しいやり方が生まれたり、逆に以前使えたものが使えなくなったりといったことがスピーディーに移り変わっていきます。
といっても今回のは2年くらい前にはすでに変わっていたようなので、単なる私の怠慢ですが…
アンテナは常に高く張っていなければと実感した出来事でした。