可変idにも対応! Seleniumで表示テキストから要素を取得する方法
ノンプロ研でPython勉強中です。
WindowsでのPower Automate Desktop台頭以降、Python x Seleniumによるスクレイピングを学ぶ意義が低下しているとも言われています。
とはいえ、Power Automate Desktopを使えないMacユーザーとしては、スクレイピングのためにPythonを学ぶ意義はあります。
もちろんスクレイピングに限らずPythonは色々できるので、可能性は無限大です。
さて、今日はPython x Seleniumでスクレイピングしようとしてぶち当たった壁とその克服方法です。
webページを読み込む度にidが変わる要素の取得がしたい
表題の通りなのですが。
<button tabindex="0" id="ember972" class="xxxxx yyyyy zzzzz" type="button">
ボタンA
</button>
みたいなhtmlタグがあり、idは毎回変わってしまう上にclass等は他の要素と重複しています。
テキスト要素のボタンAが唯一ユニーク(重複のない)要素なので、このテキスト要素で取得したいのです。
またidが振られず選択式のボタンが表示される下記のようなコードにも対応したいです。
<button class="aaaaa bbbbb ">
ボタンA
</button>
<button class="aaaaa bbbbb ">
ボタンB
</button>
結論としてXPath構文の書き方を覚えることで取得できることがわかりました。テキストだけからも要素取得はできそうですが、同じページ内に同じテキストがあった場合などにも対応できるようにclassとテキストなどいくつかの要素を組み合わせた条件で取得するのが精度が高そうです。
browser.find_element_by_xpath("//button[contains(@class, 'xxxxx yyyyy zzzzz') and contains(., 'ボタンA')]")
browser.find_element_by_xpath("//button[contains(@class, 'aaaaa bbbbb') and contains(., 'ボタンB')]")
XPathの基礎に関してはOctoparseというノンコードでスクレイピングができるサービスのヘルプページが参考になりました。
テキストから要素を取得できるようになるとスクレイピングは捗りそうです。
しかし、Pythonだけでなくhtmlやcssの基礎知識や果てはXPath構文にまで通じてないと自由自在にスクレイピングできないので、学ぶことは多いですね。
そんな大変な学習もノンプロ研に参加するとサクサク進みます。ノンプロ研は参加者みんながフラットなコミュニティで、講師やカリスマなどのヒエラルキーがありません。
それでもお困りごとは、有志の誰かがささっとサポートしてくれる心強いコミュニティです。