seleniumでデータが取れない場合に考えること〜IFRAMEと呼ばれる罠〜

Python
この記事は約4分で読めます。

今回はseleniumについて、データが上手く取れないなぁと悩んだときに大概引っかかってる要因となっているiframeと言うなのHTML特有の作りについて解説していきたいと思います。

iframeの簡単な説明をして、その後seleniumでiframeに対応するためのswitch_toメソッドの紹介をしていきます。

では、いってみましょう。

スポンサーリンク

IFRAME(アイフレーム)とは?

では、まずはIFRAMEとはそもそも何か?と言うところから始めます。

iframeとは、HTMLの要素(タグ)の一つで、Webページ内に矩形の領域を設け、別のWebページなどを読み込んで表示するもの。

http://e-words.jp/w/iframe.html

定義だけみてもよくわからないかもですが、IFRAMEとはinline frameの略で、定義にもあるように別のWebページを読み込んでインラインで表示するものです。

インラインとは、ざっくりいってしまうと、基本のHTMLの中に、別のHTMLドキュメントをもう一個付け加えている感じ。要は、ページの中にさらにページがあるんだ、ってノンプロ的には理解してしまえばいいかと思います(ざっくりすぎ汗)

一般的にiframeが利用されるケースとしては、google mapやtwitter/facebookなどのタイムラインをページ内に表示するケースで利用されるケースが多いですが、それ以外でも実は結構iframeで表示されているコンテンツがページ内に存在することがあります。

IFRAMEの基本のき

そもそもIFRAMEがどう言う設定(コード)なのかが、理解できないとこの後の問題が発生する理由や発見の仕方が理解しにくくなるので、脱線気味ではありますが、IFRAMEの基本のきを解説していきたいと思います。

IFRAMEコード

ざっくりやると以下のようなやつです。idとかは別になんでもいいのですが、肝は①iframeと言うタグであること②srcで埋め込むページのURLを指定することの2点になります。

<iframe id="inline-frame"
  width="表示幅"
  height="表示高"
  src="埋め込むページのURL">
</iframe>

要はIFRAMEとは?

要はさっきの肝①で書いたようにHTMLタグの一種です。詳しく理解されたい方はmozila docを貼っておきましたので、お読みください。

<iframe>: インラインフレーム要素 - HTML: HyperText Markup Language | MDN
HTML のインラインフレーム要素 () は、入れ子になった閲覧コンテキストを表現し、現在の HTML ページに他のページを埋め込むことができます。

seleniumで要素指定するときにiframeがあると?

シンプルに要素指定しても取得できません。なんで動かないのか?ってよくハマると思いますが、そうしたら、developer toolとかでiframeって検索して、iframeないに指定したい要素が入ってないか調べてみるといいと思います。

別にコードが間違ってるわけではなく、iframe内にデータがあるので、以下で紹介するswich_toと言うメソッドを利用して、iframe内に入っていかないと動作しないだけです。

selenium switch_toメソッドを利用してiframeを指定する

それでは、iframeに対する解法です。何度も述べてきたようにswitch_toと言うメソッドを利用します。

iframe = driver.find_element_by_id('#iframe')
driver.switch_to.frame(iframe)

iframeと言う変数にiframeを認識させます。このケースではby_idを利用していますが、tag nameで引っ張る場合は以下のようになります。

iframe = driver.find_element_by_tag_name('iframe')

iframeを指定して、driverにswitch_toメソッドで、frameメソッドを利用して、先ほど取得した対象となるiframeを渡してあげれば、iframe内に潜れます。

まとめ

iframeへの潜り方は別に難しいものではありません。そもそも要素がiframe内にあるのかどうかをちゃんと認識することさえできれば、皆さんなら問題なくできると思います。

ちなみにレアなケースではiframeが複数階層になっている場合がありますので、そのようなケースではiframeに潜った後に、さらにiframeに潜ると言うことを繰り返していただければ可能です。

要はsrcで別のurlを呼び出している関係でseleniumでは追加の指定をしないと動作しないよ、ってだけ覚えておいていただければ。

参考書籍)学習のための参考書籍紹介

seleniumの参考書籍といったらこれでいい気がします。実践入門なので、初学者にはちょっと読み応えがあるかも。

または、こっちのスクレイピングの本。初学者でも行けると思います。私も持ってて、昔よく活用してました。

タイトルとURLをコピーしました