seleniumでスクレイピングまたはブラウザ操作中に要素が取得できないというエラーはよく出ます。
そんなときは慌てず騒がずコードの確認をしましょう。
ここでは自分がハマった経験をもとに要素が取得できないときに確認すべきことを書いていきます。
確認すべきこと
もし要素が取得できない場合は、以下の点を確認してください。
- iframeが存在するかどうか
- タイプミス
- 要素の取得方法が間違っている
1.iframeが存在するかどうか
自分がよく引っかかったのはこのパターンです。
以下のようなコードの場合、要素をidなどで直接取得しようとするとエラーになります。
<iframe src=....> ~省略~ <div id=xxx>取得したい要素</div> ~省略~ </iframe>
これは自分がいるframe位置が間違っているからです。 まずは、取得したい要素の上に'iframe'の文字が無いか探しましょう。
見つかった場合は、switch_to.frameをする必要があります。
iframeのxpathをコピー(xpath以外でも良いがxpathが簡単)し、以下のように書きましょう。
frame=driver.find_element_by_xpath(<iframe>のxpath) driver.switch_to.frame(frame)
または
driver.switch_to.frame(driver.find_element_by_xpath(<iframe>のxpath))
これでも要素が取得できない場合、現在のframe位置が間違っている可能性があります。
その場合は、以下のコードでdefault位置に戻してからframe移動してください。
driver.switch_to.default_content()
frameが問題の場合はこれで要素が取得できるはずです。
2. タイプミス
意外とありがちなミスです。
使用しているエディタの機能などを利用してミスが無いか探しましょう。
3.要素の取得方法が間違っている
idが無いのにidを取得しようとしたり、間違った要素を取得している場合があります。
一度xpathで取得してみて動くようだったら取得の仕方が間違っています。
最後に
自分はこの3つで引っかかり、必要としているソフトを作るのに苦労しました。
iframeはやり方を覚えてしまえば簡単なので、どうもうまく行かない場合はまずはframeの確認をしてみましょう。
基本的にxpathで要素を取得すればコードは書きやすくなります。
ただ、プログラムの動作速度は他の要素を取得するほうが早いかもしれません(未検証)。
xpathでも十分な速度が出るので不都合は無いかと思いますが、もし気になるのであればそのあたりを検証してみるのも良いと思います。
また、スクレイピングをする上でwebサイトの規約はよく読みましょう。
スクレイピングを禁止しているサイトもあるので注意してください。
スクレイピングはサーバーに負荷をかける行為なので、そのことを頭に入れた上でご利用ください。