5 年以上の経験を持つ Web スクレイピングとプロキシの専門家として、私は XPath が Web 要素を見つけるための最も便利で汎用性の高い技術の XNUMX つであることを発見しました。 XPath セレクターをマスターすると、最も複雑な Web ページからも正確にデータを抽出できるようになります。
この 3200 語以上の包括的なガイドでは、Selenium の XPath を使用した要素の検索と操作について学んだすべてを共有します。
XPath とは一体何ですか?
使用法に入る前に、XPath が実際に何であるかを理解することが重要です。
XPath は XML パス言語の略です。これは、XML ドキュメントからノードを選択するためのクエリ言語です。基本的に、XPath は XML 構造の一部を記述するための構文を提供します。
HTML は XML のように構造化されており、開始タグと終了タグのように要素がネストされているため、XPath を使用して HTML ドキュメントの一部をターゲットにすることもできます。
w3schools によると、XPath に関するいくつかの重要な事実は次のとおりです。
- XPath はパス式を使用して XML ドキュメント内のノードまたはノードセットを選択します
- これらのパス式は、従来のコンピュータ ファイル システムを操作するときに見られるパス式と非常によく似ています。
- XPath には、文字列、数値、ブール値、ノードセットなどを操作するための 100 を超える組み込み関数が含まれています。
- XPath は XSLT (Extensible Stylesheet Language Transformations) の主要な要素です。
要約すると、XPath は、XML ドキュメントをナビゲートするために設計された強力なクエリおよび抽出言語です。
XPath と Selenium はどのように関係しますか?
Selenium は、Web ブラウザを制御するための自動化フレームワークです。 Selenium で Web ページを読み込むと、HTML コンテンツが DOM (Document Object Model) 構造に解析されます。
DOM は、ページをネストされた HTML 要素のツリーとして視覚的に表します。
XPath を使用すると、DOM をトラバースして、ページ上の特定の要素を見つけて操作することができます。
たとえば、次の簡略化された HTML について考えてみましょう。
<html>
<body>
<div>
<p>Hello World!</p>
</div>
<div>
<img src="logo.png"/>
</div>
</body>
</html>
DOM は次のようになります。
html
/ \
body
/ \
div div
| |
p img
その後、XPath 式を使用して、この構造内の要素をクエリできます。
/html/body/div[1]/p
//div/img
これにより、XPath は、Selenium を使用してページの特定の部分のアクションを自動化するのに非常に便利になります。
XPath 構文の基本
XPath の役割を理解したところで、構文を詳しく見ていきましょう。
XPath は、パス式を使用して XML ドキュメント内の要素と属性を選択します。この式は、コンピュータ上のファイル システムのパスに非常によく似ています。
/Users/jsmith/Documents/letter.docx
スラッシュ / は、ネストされたフォルダー内を下に移動します。
いくつかの基本的な XPath パターン:
nodename
– ノード名という名前を持つすべてのノードを選択します/
– ルートノードから選択します//
– 任意の深さのノードを選択します.
– 現在のノードを選択します..
– 親ノードを選択します@
– 属性を選択します
例:
/html/body/div - Selects all div tags under body
//div - Selects all div tags anywhere
div[@class=‘header‘] - Selects div tags with matching class attribute
このガイドではさらに多くの特殊な構文について説明します。ただし、これらの基本パターンを使用すると、ターゲットを絞った XPath セレクターの作成を開始できます。
私の経験によると、5 ~ 10 個の基本的な XPath 式をマスターするだけで、ほとんどの Web サイト上の要素を見つけることができるようになります。
Web 要素を検索する find_element
& find_elements
Selenium には、XPath を使用して要素を検索するための 2 つの主な方法が用意されています。
find_element()
– XPath に一致する単一の WebElement を返しますfind_elements()
– 一致するすべての WebElement のリストを返します。
簡単な使用例を次に示します。
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.example.com")
# Find single element
element = driver.find_element(By.XPATH, ‘//img‘)
# Find multiple elements
elements = driver.find_elements(By.XPATH, ‘//div‘)
これら 2 つの方法を使用すると、XPath の機能を活用して、Web ページの特定の部分を自動化された方法で操作できるようになります。
要素を見つけるためのヒント
私の長年の経験に基づいて、XPath セレクターを構築する際の重要なヒントをいくつか紹介します。
HTMLソースを検査する – 生の HTML コンテンツを表示すると、ターゲット要素に対する固有の属性とパターンを識別できます。最新のブラウザにはすべて、ソースを表示するための開発者ツールが備わっています。
ブラウザで XPath をコピーする – ほとんどのブラウザ開発ツールには、要素の完全な XPath をコピーする機能も含まれています。その後、これらのベースライン セレクターを調整して簡素化できます。
IDに注目 – ページ要素の id 属性は、次のような最も直接的でユニークなセレクターを提供します。
//input[@id=‘search‘]
.クラスが役立ちます – クラス属性により、次のようなより柔軟なクエリが可能になります。
//div[@class=‘results‘]
たとえ完全にユニークでなくても。インデックスを避ける – [1]、[2] のような位置インデックスへの依存を構築すると、ロケーターが脆弱になります。
短いほど良い – 最小限のネストされたステップを備えた簡潔な XPath は、遅いクエリや不正確な一致を回避するのに役立ちます。
これらのガイドラインをマスターすると、必要なページ要素をエレガントに対象とする堅牢な XPath セレクターを構築するのに役立ちます。
一般的な XPath パターンとレシピ
基本は理解できたので、XPath パターンの一般的な例をいくつか見てみましょう。
属性値による選択
//input[@type=‘submit‘]
//a[@href=‘contact.html‘]
部分的な属性の一致
//input[contains(@name, ‘search‘)]
//div[starts-with(@class, ‘result‘)]
テキスト一致を選択
//p[text()=‘Hello World‘]
//h2[contains(text(), ‘Welcome‘)]
子供を選択
/div/p
//tbody/tr/td
インデックス付き選択範囲
(//input[@type=‘button‘])[2]
連鎖選択
//div[@id=‘nav‘]/ul/li/a
兄弟をフォローする
//h1[text()=‘Articles‘]/following-sibling::p
これらの一般的なテクニックをそれぞれよく理解しておくことをお勧めします。これらは、堅牢なクエリを構築する際に役立つ XPath スキルのツールキットを形成します。
スクレイピング例
Python で Selenium と XPath を使用した Web スクレイピング スクリプトの例を見てみましょう。
e コマース サイトから商品データを抽出します。
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# Initialize driver
driver = webdriver.Chrome(‘/path/to/chromedriver‘)
# Load page
driver.get(‘https://www.example.com‘)
# Click shop link
shop_link = driver.find_element(By.LINK_TEXT, ‘Shop‘)
shop_link.click()
# Wait for new page to load
time.sleep(5)
# Extract product details
product = driver.find_element(By.XPATH, ‘//div[@class="product"][1]‘)
name = product.find_element(By.XPATH, ‘.//h2‘).text
description = product.find_element(By.XPATH, ‘.//p‘).text
price = product.find_element(By.XPATH, ‘.//span[@class="price"]‘).text
print(name, description, price)
# Close browser
driver.quit()
これは、XPath を使用して、ネストされたページ データをスクレイピングする要素を正確にターゲットにする方法を示しています。
一般的な問題と解決策
Selenium で XPath ロケーターを使用するときに発生する可能性のある一般的な問題と、緩和策をいくつか示します。
タイムアウト
ページの読み込みに時間がかかる場合は、暗黙的待機と明示的待機を使用します。
from selenium.webdriver.common.by import WebDriverWait
driver.implicitly_wait(10)
WebDriverWait(driver, 20).until(expected_conditions)
古い要素
DOM が変更された場合は、古い要素の例外を避けるために要素を再配置します。
elements = driver.find_elements(By.XPATH, ‘//div‘)
# DOM updates, elements now stale
elements = driver.find_elements(By.XPATH, ‘//div‘)
ブラウザの互換性
一部の高度な XPath 機能は、すべてのブラウザーで動作するとは限りません。動作をテストし、必要に応じて簡素化します。
パフォーマンスが遅い
非常に複雑な XPath 式は、テストの実行速度を低下させる可能性があります。可能な限り構造を簡素化します。
透明性
一致した要素が必ずしも表示されるとは限りません。対話する前に、それらが表示されていることを確認してください。
経験はこれらの問題を予測するのに役立ちます。時間が経つにつれて、それらははるかに簡単に対処できるようになります。
XPath の代替案
XPath は強力ですが、常に最適なソリューションであるとは限りません。一般的な代替案をいくつか示します。
CSSセレクター
CSS セレクターは、要素を見つけるためのシンプルで使い慣れた方法を提供します。
driver.find_element(By.CSS_SELECTOR, ‘input[type="submit"]‘)
driver.find_element(By.CSS_SELECTOR, ‘.search-box‘)
ID と名前の属性
ID または名前が本当に一意である場合は、次を使用します。
driver.find_element(By.ID, ‘search‘)
driver.find_element(By.NAME, ‘query‘)
リンクテキスト
完全なリンク テキストを照合すると、複雑なクエリを回避できます。
driver.find_element(By.LINK_TEXT, ‘Logout‘)
特定のニーズに合わせて各オプションを評価してください。 XPath、CSS、ID、リンク テキスト ロケーターを組み合わせると最大限の堅牢性が得られることがよくあります。
ロケーター戦略の比較
ここでは、XPath といくつかの一般的な代替要素配置戦略との比較を示します。
方法 | 例 | メリット | デメリット |
---|---|---|---|
XPath | //div/p | 非常に柔軟なクエリ | 複雑な構文 |
CSSセレクター | 除算結果 p | 使い慣れた構文 | クラス/ID/属性のみをターゲットとする |
ID | #サインアップフォーム | 非常に高速でユニークな | IDが必要です |
名前 | 名前=クエリ | ユニークな | 命名規則に依存する |
リンクテキスト | ログアウト | リンクとしてはシンプル | リンクテキストのみ |
ご覧のとおり、各戦略にはトレードオフがあります。 XPath を CSS セレクターおよび属性とともに使用すると、強力なロケーターの柔軟性が得られます。
lxml と parsel の高度な使用法
Selenium には非常に便利な検索メソッドが組み込まれていますが、lxml や parsel などの専用の解析ライブラリは、複雑なスクレイピング タスクに追加の機能を提供します。
これらのライブラリは、次のような他の多くの機能とともに、堅牢な XPath サポートを提供します。
- 高速な HTML および XML パーサー
- XPath 1.0 および 2.0+ のサポート
- 幅広い XPath 関数と演算子
- HTML を解析するための便利なバインディング
- Scrapy などの人気のあるフレームワークとの統合
使用例:
from lxml import html
tree = html.parse(‘page.html‘)
p_elements = tree.xpath(‘//p‘)
from parsel import Selector
sel = Selector(text=html_text)
links = sel.xpath(‘//a/@href‘).getall()
より重いスクレイピング ジョブの場合、私は Selenium の組み込み機能を補完するためにこれらのライブラリを使用することがよくあります。
結論と重要な教訓
XPath による要素の検索は、テスト自動化や Web スクレイピングに Selenium を使用する人にとって不可欠なテクニックです。
XPath を活用して複雑なサイトを操作する 5 年以上の経験から私が学んだ重要な教訓をいくつか紹介します。
まず、属性の一致、テキストの選択、子の選択など、いくつかのコア XPath パターンを学習することから始めます。ほとんどの使用方法は、これらの基本に基づいています。
簡潔かつユニークなクエリのバランスをとるには練習が必要です。それは科学であると同時に芸術でもあります。
ソースを検査し、初期 XPath 文字列をコピーするためのブラウザー開発者ツールに慣れてください。
必要に応じて、XPath を CSS セレクターと id/name 属性で補完します。アプローチを組み合わせることで、最大限の堅牢性が得られます。
Selenium を超えたスクレイピング機能を強化するには、lxml や parsel などの高度な XPath 解析ライブラリを検討してください。
経験を通じて、時間の経過とともに古い要素やタイムアウトなどの一般的な問題を予測して処理する方法を学びます。
このガイドが、Selenium を使用した XPath 要素選択の機能を活用するための包括的なリファレンスを提供できれば幸いです。他に具体的な質問がある場合はお知らせください。