【Selenium】p/divタグ等の子要素を除外したテキストだけ取得する

- Python -
2020.08.26
Python[パイソン]

Seleniumでとあるテキストを取得しようとして「これ、どうやって抜き出すんだ?」という地味に困ったパターンがあったのでメモ。

Selenium 子要素を含まないテキストノードだけ取得したい時

以下のようにpタグ直下のテキスト「ここを抜き取りたい」だけが欲しくて、pタグ子要素のspanタグ内のテキスト「ここは不要」は邪魔、という場合です。

index.html<!DOCTYPE html>
<html>

<p class="a">
    <span class="b">ここは不要</span>
    ここを抜き取りたい
</p>

</html>

以下8行目のようにpタグを指定して.textで抜き出しても......

test.pyimport chromedriver_binary
from selenium import webdriver

driver = webdriver.Chrome()
url = 'http://127.0.0.1:5500/index.html'

driver.get(url)
p_text = driver.find_element_by_class_name('a').text
print(p_text)

以下のように「ここは不要」まで取れてしまいます。

$ python test.py

ここは不要 ここを抜き取りたい

$

どうしようかと考えて調べてみてもなかなかヒットしなかったので、

SeleniumでJavaScriptを実行し、spanタグを削除する

という手法を取りました。

以下10行目で削除するspanタグを取得し、11行目でJavaScriptを実行し削除。

test.pyimport chromedriver_binary
from selenium import webdriver

driver = webdriver.Chrome()
url = 'http://127.0.0.1:5500/index.html'

driver.get(url)

# spanタグを削除
span_remove = driver.find_element_by_class_name('b')
driver.execute_script('arguments[0].remove()', span_remove)

p_text = driver.find_element_by_class_name('a').text
print(p_text)

これで、子要素内のテキストを外して直下のテキストノードだけ取得することができました。

$ python test.py

ここを抜き取りたい

$

↑TOP