「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」を使う場面には遭遇してないけれど、いつでも使えるようにはしておきたいです。