スクレイピングによくつかうSeleniumで、うまく要素のテキストが取得できないときの対策方法
ハマりやすいポイント
- クラス名にスペースが含まれている
- クラス名はあっているのにテキストが取得できない
今回は、この2つのポイントについて対処法をまとめます。
クラス名にスペースが含まれている場合
JavaScriptであれば、スペースが含まれていても
document.getElementByClassName("class name").innerText;
のように、そのままクラス名を記述するだけで、
指定したクラス名のテキスト要素は簡単に取得できます。
それをSeleniumで代替する場合は、
WebDriver.findElement(By.cssSelector("div[class='class name']")).getText().toString();
のようにBy.cssSelectorを使って、
WebDriver.findElement(By.cssSelector("{タグ名}[class='{クラス名}']"))
で指定するとうまくテキスト要素が取得できます。
次にクラス名は合っているのにテキストが取得できない場合
Seleniumで取得できる要素のタグの種類が明確には調べていませんが、
主にdiv
,a
,table
,tr
,td
に限られていて
span
タグやb
タグその他の要素を特定するにはXpathで要素を直接指定するか、
取得したい要素の親要素でdiv
タグの要素のクラス名を指定して、取得が可能になります。
<div class="div_class_name">
<b class="b_class_name">
<span class="span_class_name">取得したいテキスト</span>
</b>
</div>
この場合、div
タグのクラス名 "div_class_name
"を利用してテキストの取得が可能です。
Xpathを用いる場合は、
Chromeの開発ツールを使って、要素にマウスがフォーカスしている状態で
右クリック→ [Copy] → [Copy XPath]
でXPathが取得できるので、
WebDriver.findElement(By.xpath("{xpath}")).getText();
でテキストを取得できます。
以上です。
それと記事のテーマとは逸れますが、
JavaScriptとSeleniumではスクロール処理が微妙に食い違うところがあるので、
その点も注意が必要ですね。
JavaScriptではうまく取得できてもSeleniumだとたまに期待通りに動作しないときがあるので、
最悪、Javaコードの中にJavaScriptコードを埋め込んで稼働させることも可能なので、
それさえ知っておけば大丈夫です!