Pythonのセレニウムを使ってスクレイピングする際に、HTMLデータをクラス名を指定して取ろうとしたら以下のようなメッセージが出て処理が止まってしまった。またはログが大量発生なんてことがありました。(止まる時とそのまま実行できる時があるのが不思議)
find_element_by_class_name is deprecated. Please use find_element(by=By.CLASS_NAME, value=name) instead”)
どうやら以下のような書き方は最新のセレニウムのバージョンでは非推奨になってしまったようです。
driver.find_element_by_class_name(“class-name”)
クラス以外も全て書き方を下記のように置き換える必要があるようです。
driver.find_element(By.CLASS_NAME, “class-name”)
By.大文字で書くルールに変わったようです。
わかったものの覚えてられる気もしないし、コード打ち込むのがだるいのでコピペ用に以下にまとめます。
find_element()書き方一覧
find_elements()は複数形のsを追加するだけで以下の置き換えコードとほぼ同じ書き方なので省略しています。
参考元
Upgrade to Selenium 4 | Selenium
find_element_by_* commands are deprecated in selenium Stack OverFlow
import文
find_element()を書き換える場合は以下のimport文も合わせて使います。
from selenium.webdriver.common.by import By
import文を忘れると以下のようなエラーがでます。
‘By’ is not defined selenium
クラス
今までの書き方
driver.find_element_by_class_name(“class-name”)
新しい書き方
driver.find_element(By.CLASS_NAME, “class-name”)
ID
今までの書き方
driver.find_element_by_id(“element_id”)
新しい書き方
driver.find_element(By.ID, “element_id”)
name属性
今までの書き方
driver.find_element_by_name(“element_name”)
新しい書き方
driver.find_element(By.NAME, “element_name”)
リンクテキスト
今までの書き方
driver.find_element_by_link_text(“element_link_text”)
新しい書き方
driver.find_element(By.LINK_TEXT, “element_link_text”)
パーシャルリンクテキスト
今までの書き方
driver.find_element_by_partial_link_text(“element_partial_link_text”)
新しい書き方
driver.find_element(By.PARTIAL_LINK_TEXT, “element_partial_link_text”)
タグ名
今までの書き方
driver.find_element_by_tag_name(“element_tag_name”)
新しい書き方
driver.find_element(By.TAG_NAME, “element_tag_name”)
CSSセレクタ
今までの書き方
driver.find_element_by_css_selector(“element_css_selector”)
新しい書き方
driver.find_element(By.CSS_SELECTOR, “element_css_selector”)
xpath
今までの書き方
driver.find_element_by_xpath(“element_xpath”)
新しい書き方
driver.find_element(By.XPATH, “element_xpath”)
おわり
慣れるまでは非推奨のメッセージをよく見かけることになりそうですね。