今回は Selenium Webdriver で find_element や find_element_by_XXX などの find 系の操作について解説します。
なるべく「例」をたくさん記載して直感的に分かりやすくするように心がけています。
【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング【Part.1】
【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング【Part.2】
【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング【Part.3】
【Python】Python 3.6 & Selenium WebDriver & PhantomJS でスクレイピング(find系操作)【Part.4】
【Python】Python 3.6 & Selenium WebDriver & PhantomJS でスクレイピング(URLを引数で受け取る)【Part.5】
Selenium Webdriver の find 系操作
find系の操作一覧を以下に記載します。
自分でも思い出せるように例をなるべくたくさん記載しています。
find_element(by=’XX’, ‘XXX’)
by で指定したエレメントを探します。
find_element_by_XXX と同じ意味です。
【例】
driver.find_element(By.XPATH, ‘//button’)
driver.find_element(By.ID, ‘id_test’)
driver.find_element(By.CLASS_NAME, ‘cl01’)
driver.find_element(By.CSS_SELECTOR, ‘span’)
※elementとは?
要素、成分、構成部分などの意味です。
find_element_by_class_name(‘XXX’)
class名を探します。
【例】
driver.find_element_by_class_name(‘content’)
driver.find_element_by_class_name(‘container’)
driver.find_element_by_class_name(‘wrapper’)
driver.find_element_by_class_name(‘footer’)
driver.find_element_by_class_name(‘body’)
driver.find_element_by_class_name(‘side_bar’)
■class名とid名の違い
- class名 ← 1ページ中に何度も使用可能
- id名 ← 1ページ中に1度しか使用しない
find_element_by_css_selector(‘XXX’)
cssセレクター(css selector)を探します。
【例】
driver.find_element_by_css_selector(‘.test-selector’)
driver.find_element_by_css_selector(‘.sample’)
driver.find_element_by_css_selector(‘.small’)
■css selectorとは
概念が難しくてあまりよく分かっていません。
例えば、p.side_bar{font-size:30px;}の場合、「.side_bar」が css selector になります。
find_element_by_id(‘XXX’)
id属性値でエレメントを探します。
【例】
driver.find_element_by_id(‘title11’)
driver.find_element_by_id(‘login12’)
idは1ページ中に1度しか登場しません。
そのため、例のように「ここだけでしか使われなさそうな」名前で使われます。
そういう意味では Web スクレイピングで探しやすいと言えます。
id属性を利用する場合は Web アプリケーションの開発者が手動で割り振る場合もあれば、Web アプリケーションを動かしているサーバーが動的に割り当てている場合もあります。
find_element_by_link_text(‘XXX’)
リンクテキスト名で探します。
【例】
driver.find_element_by_link_text(‘Login’)
driver.find_element_by_link_text(‘ログイン’)
driver.find_element_by_link_text(‘新規取得’)
find_element_by_name(‘XXX’)
名前でエレメントを探します。
【例】
driver.find_element_by_name(‘Form’)
driver.find_element_by_name(‘Account’)
driver.find_element_by_name(‘Password’)
find_element_by_partial_link_text(‘XXX’)
リンクテキストの部分一致で要素を探します。
「login」ならリンクの中に「login」の文字が含まれていることになります。
【例】
driver.find_element_by_partial_link_text(‘login’)
driver.find_element_by_partial_link_text(‘Login’)
find_element_by_tag_name(‘XXX’)
タグ名で要素を探します。
【例】
driver.find_element_by_tag_name(‘H1’)
driver.find_element_by_tag_name(‘a’)
driver.find_element_by_tag_name(‘body’)
タグ名で要素を指定する場合は、name や id を指定する場合とは異なり、検索した結果がゼロの場合があれば、複数の場合もあり得るからです。
例えば Google のトップページで、driver.find_element_by_tag_name(‘button’) で要素を検索すると複数の結果が返ります。
ちなみに複数の結果が返ってくる場合は「find_elements_by_tag_name」メソッドの方を選択します。
find_element_by_xpath(‘XXX’)
xpath で要素を探します。
【例】
driver.find_element_by_xpath(‘//div/td[1]’)
driver.find_element_by_xpath(‘//*[@id=”locating-elements”]/div[1]/div/pre/span[3]’)
driver.find_element_by_xpath(‘//*[@id=”pager-top”]’)
XPath は、XML Path を縮めた名前です。
XPath というと、一見難しそうに感じますが、XML のパスを記述しているだけです。
■XPathの構文
- ルート要素は // です。
- すべての div 要素を指定する構文は //div です。
- div 要素中の link タグを指定する構文は //div/a です。
- タグ内の全要素を指定するには * を使います。この構文は、//div/* というように使います。
- ルートから3階層目にあるすべての div 要素は、//*/*/div で指定できます。
- 特定の要素を指定するには、その要素の属性値を使います。例えば、//*/div/a[@ id=’attrValue’ とすれば、anchor 要素が返されます。この要素は、ルートから3階層目にあり、div 要素の中にあり、id の値が attrValue になっているものです。
■XPathの欠点
XPathの欠点は、検索に時間が掛かるということです。
要素を指定するたびに、WebDriver はページ全体を検索することになるので、時間が掛かります。
スクリプト中にあまり XPath を使いすぎると実行が遅くなる可能性があります。
現在勉強している本&参考にしている本
Seleniumでどうすればいいのか分からなくなった時に読む本です。
サンプルプログラムは Java で書かれていますが、オプションや構文などは Python でも役に立ちます。
Pythonでどうやって Web スクレイピングをすればいいのか参考になる本です。こちらもどうすればいいのか迷った時に読む本です。
今までの連載
【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング【Part.1】
【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング【Part.2】
【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング【Part.3】
【Python】Python 3.6 & Selenium WebDriver & PhantomJS でスクレイピング(find系操作)【Part.4】
【Python】Python 3.6 & Selenium WebDriver & PhantomJS でスクレイピング(URLを引数で受け取る)【Part.5】
コメント