Python selenium でスクレイピングの際、要素が見つからないno such elementエラー時に for文のループをスキップする方法(例外処理try文とIF文のcontinueの組み合わせ)

Python selenium でスクレイピングの際、要素が見つからないno such elementエラー時に for文のループをスキップする方法

前提やりたい事

Python selenium3 で ページを推移してページの要素を順番にスクレイピングして値を取得したい。

今まではそのページIDを、リストにして for文で順番にページを表示して取得していた。

今回は棚卸しで商品コードがそのWEBページに存在するかどうかわからない条件で、ページを遷移させる必要が出てきた。しかも棚卸しなので、商品コードは大量なので、とてもfor文のリストを手打ちでは出来ない。

プログラム仕様

対策1 for文に使う商品コードのリストを、手打ちしていたのを辞めて、excelシートからセルの値を読み込みする に変更

対策2 存在しないページに遷移した場合に、エラーで止まらないように例外処理する

今まで、必ず存在するとわかっている商品IDをリストに手打ちして、for文で商品IDを順番に入れて検索で詳細ページに遷移していた。

しかし今回使う商品コードの参照元はAirレジ(POSレジ)に登録されていた商品コードのCSVファイルなので、色々なメーカーの商品コードが混在して存在している。

登録されているデータでは商品名や商品コードで統一性がなく、CSVファイルでコードをメーカーごとにソートが出来ない。

仕方なく手打ちでメーカー名を商品名の横に記載してソートして、for文に読み込ませようかと思ったけが、それも面倒くさい。

それなら、最初から エラーがでる前提でプログラムを書いて、エラーが出た時
つまりメーカーHPにて商品コードで検索しても、商品がヒットしない場合でも、エラーで止まらないようにする。

そして、for文の最初に戻って(ループに戻す)、次のコードで検索して新たなページを検索するようにしたい。と思った。

詰まった部分(最初に考えた処理)

try 文の例外処理 except とelse やpassの組み合わせで出来ると思っていたが、出来なかった。

try:要素をみつける処理文

         pass  (エラー発生しても中断しない)

except:

  エラーが起きたとき(ページの要素が見当たらない場合)に処理する文
 (for文の最初にスキップさせたいが no s uch elementでエラー文がでて止まる)

else:

  エラーが起きなかった時に処理する文


問題点

Try文を使って 要素取得のエラー「No Such Element Exception」が出た時に次の処理文をスキップして、次のfor文の最初のループへ戻してやりたいと思った。

実際のエラー文
NoSuchElementException: Message: no such element: Unable to locate element: 

しかし、try文の処理 でエラーが出た場合のexceptの処理で、for文のループの最初に戻してやる方法がわからなかった。


解決方法

 
from selenium.common.exceptions import NoSuchElementException
	 try: # 要素を探すコード
    except NoSuchElementException as e:
            if e !=None: #e(要素が見つからないエラーの値がある時はループ最初に戻る)
               continue
    else:
         #ページ(要素)が存在する時の処理

エラー文で調べた所、NoSuchElementExceptionは selenium特有のエラーのため、エラー自体を認識する文を入れる必要があった。それがこの文

from selenium.common.exceptions import

この文をいれると エラーのが出た時の値が NoSuchElementExceptionに入る

その値が存在した時だけ、if文のcontinueで 後の処理をせずにfor文のループの最初に戻してやると解決しました。

まとめ

しかし、かなりハマりました・・・

最初は try 文の except とelse の例外処理の組み合わせだけで出来ると思っていた。

エラーの内容もimportしないと行けないケースがあるんですね。 IF文もtry文と組み合わせる方法が出来たら、色々と応用できそうです



問い合わせ Copyright © 合同会社しんせつ All Rights Reserved.