Python

Python+Seleniumで2つの属性を使って要素を取得するには?

Python+Seleniumで2つの属性を使って要素を取得するには?

「Python + Selenium」でHTMLの要素を取得する方法や、テキストやリンクURLの部分一致で取得する方法など、これらの知識を組み合わせて使えば困ることはありませんでした。

ところが、次のようなHTMLに出くわしたのです。

<a href="https://~" id="a" class="b">リンク</a>
<a href="https://~" id="a" class="c">リンク</a>
<a href="https://~" id="a" class="b">リンク</a>
<a href="https://~" id="a" class="b">リンク</a>
<a href="https://~" id="a" class="c">リンク</a>

通常であれば、id属性はページに1つしかありません。
しかし、「YouTube Studio」では同じid属性が複数存在するのです。

今までの知識で行くと、id属性が複数あるので「find_elements_by_id()」と複数形を使って該当要素を取得し、インデックスで指定することを考えます。
ただ、今回はインデックスに規則性が無いのです。
幸い、「id="a" class="c"」の1つ目を取得したいケースだったので、2つの属性を指定して要素が取得できれば解決します。

 

2つの属性を指定してHTML要素を取得するには?

XPathで「and」を使います。
「id="a" class="c"」に一致する1つ目の要素を取得したい場合は、次のように書きます。

from selenium import webdriver
 
driver = webdriver.Chrome(【chromedriver.exeのパス】)
 
print(driver.find_element_by_xpath('//a[@id="a" and @class="c"]'))

 

「or」や「not」はXPathでも使えるの?

はい、使えます。
例えば、idが「aかb」なら、「find_element_by_xpath('//a[@id="a" or @id="b"]')」と書けますし、「a以外」なら「find_element_by_xpath('//a[not @id="a"]')」と書けます。

 

まとめ

「Python + Selenium」で2つの属性を指定してHTML要素を取得するには、XPathで「and」を使えば良いです。
以前、自動化で使っていたiMacrosも2つの属性を指定する場合には「&&」を使っていたので、その考え方がそのまま使えるのはありがたいですね。
今のところ「or」や「not」を使う場面には遭遇してないけれど、いつでも使えるようにはしておきたいです。

-Python
-, , , , , , , , , , , ,