コンテンツにスキップ

Python で Web スクレイピングに XPath セレクターを使用する方法

Python を使用して Web ページからデータを抽出しようとしている場合、XPath は Web スクレイピング ツールキットに含める必要のあるツールです。 XPath は、ページの HTML 構造内を移動し、必要な要素とデータを正確に特定する方法を提供します。

このガイドでは、XPath の基本を説明し、Python を使用した Web スクレイピングにその機能を活用する方法を示します。最終的には、XPath を使用して目的のデータを外科的に抽出するさまざまなスクレイピング タスクに取り組む準備が整います。

XPathとは何ですか?

XPath は XML パス言語の略です。これは、XML または HTML ドキュメントからノードを選択するためのクエリ言語です。 XPath を使用すると、ドキュメント構造と照合するパターンを指定すると、そのパターンに一致するすべての要素が返されます。

XPath は元々 XML 用に設計されましたが、HTML でも同様に機能するため、Web スクレイピングの目的に最適です。これは、CSS セレクターや正規表現に代わる、より強力で柔軟な代替手段を提供します。

XPath 構文の基本

XPath の使用を開始するには、XPath 構文の構成要素を理解する必要があります。主要な概念は次のとおりです。

タグ名によるノードの選択

最も基本的な XPath 式は、単にタグ名を指定するものです。例えば:

  • //h1 すべてを選択します <h1> ページ上の見出し要素
  • //p すべてを選択します <p> 段落要素
  • //img すべてを選択します <img> 画像要素

属性によるノードの選択

次を使用して、特定の属性または属性値を持つ要素を選択できます。 @ 構文:

  • //*[@class="highlighted"] クラスが「強調表示」されているすべての要素を選択します
  • //a[@href] すべてを選択 <a> href 属性を持つアンカー要素
  • //img[@alt="Logo"] 選択する <img> 「ロゴ」の代替テキストを持つ要素

位置によるノードの選択

角括弧を使用すると、位置に基づいてノードを選択できます。 [] そして数値インデックス:

  • //ul/li[1] 最初のものを選択します <li> それぞれの項目 <ul> 順不同リスト
  • //table/tr[last()] 最後を選択します <tr> それぞれの行に <table>
  • //ol/li[position() <= 3] 最初の 3 つを選択します <li> それぞれのアイテム <ol> 注文リスト

関係によるノードの選択

XPath を使用すると、ドキュメント ツリーを上下に移動して、祖先、子孫、兄弟などに基づいて要素を選択できます。

  • //div[@class="content"]/* のすべての子要素を選択します <div> クラス「content」を持つ要素
  • //p/.. すべての親要素を選択します <p> パラグラフ
  • //h1/following-sibling::p すべてを選択 <p> 以降の兄弟要素 <h1> 見出し
  • //section//img すべてを選択 <img> の子孫である要素 <section> どのレベルでも

述語と関数

XPath は、選択をさらに絞り込むための幅広い述語と関数をサポートしています。

  • //p[contains(text(),"scrapy")] 選択する <p> テキスト「scrapy」を含む要素
  • //a[starts-with(@href,"https")] 選択する <a> href が「https」で始まる要素
  • //ul[count(li) > 10] 選択する <ul> 10 個を超える要素が含まれる <li> リーディングシート
  • //img[string-length(@alt) > 0] 選択する <img> 空ではない alt 属性を持つ要素

lxml および BeautifulSoup での XPath の使用

XPath 構文の基本を理解したところで、人気のある lxml ライブラリと BeautifulSoup ライブラリを使用して Python で XPath 構文を使用する方法を見てみましょう。 ScrapingBee ホームページからメインの見出しテキストをスクレイピングする例を見ていきます。

lxml と BeautifulSoup を使用した HTML の解析

まず、リクエスト ライブラリを使用して Web ページの HTML を取得し、XPath でクエリできるツリー構造に解析する必要があります。 BeautifulSoup を使用して HTML を解析し、lxml を使用して XPath 式を評価します。

import requests
from bs4 import BeautifulSoup
from lxml import etree

html = requests.get("https://scrapingbee.com") 
soup = BeautifulSoup(html.text, "html.parser")
dom = etree.HTML(str(soup))

ここに私たち:

  1. 次を使用して HTML を取得します requests.get()
  2. html.parser を使用して、HTML 文字列を BeautifulSoup オブジェクトに解析します。
  3. BeautifulSoup オブジェクトを文字列に変換して、lxml で解析できるようにします。 etree.HTML() function
  4. 文字列を lxml に解析します Element XPath を使用してクエリできるオブジェクト

XPath 式の構築と評価

解析された HTML ツリーができたので、メインを選択するための XPath 式を構築できます。 <h1> ページの見出し:

heading_xpath = ‘//h1‘

この XPath を解析された HTML ドキュメントに対して評価するには、 xpath() 方法:

heading_elements = dom.xpath(heading_xpath)

  dom.xpath() 呼び出しは、XPath セレクターに一致するすべての要素のリストを返します。この場合、一致するものは 1 つだけである必要があります <h1> 要素。

テキストと属性の抽出

要素への参照を取得したら、lxml のプロパティを使用してそのテキストと属性を簡単に抽出できます。

heading_text = heading_elements[0].text
print(heading_text)
# Tired of getting blocked while scraping the web?  

たった 1 行の XPath で見出しテキストを抽出することに成功しました。次を使用して要素の属性値にアクセスすることもできます。 get():

heading_id = heading_elements[0].get(‘id‘)  

Selenium での XPath の使用

別のアプローチは、Selenium を使用して、JavaScript を必要とする動的 Web サイトを自動化およびスクレイピングすることです。 Selenium は、XPath 文字列を使用して要素を選択するための独自のメソッドを提供します。

Selenium WebDriver の構成

Selenium を使い始めるには、まず Selenium パッケージと、使用するブラウザーの Web ドライバーをインストールする必要があります。 Chrome ドライバーを設定する方法は次のとおりです。

from selenium import webdriver
from selenium.webdriver.common.by import By

driver_path = "/path/to/chromedriver"  
driver = webdriver.Chrome(driver_path)

Chrome インストールに適切な ChromeDriver バージョンをダウンロードし、実行可能ファイルへのパスを指定してください。

XPath を使用した要素の検索

ドライバーを構成したら、Web ページに移動して要素の検索を開始できます。 Selenium の WebDriver は、 find_element XPath ロケーターを受け入れるメソッド:

driver.get("https://scrapingbee.com")

heading_xpath = "//h1"
heading_element = driver.find_element(By.XPATH, heading_xpath)

lxml の例と同様に、これは最初の <h1> ページ上の要素。 XPath に一致するすべての要素を検索したい場合は、次を使用します。 find_elements 代わりに:

paragraph_xpath = "//p"
paragraph_elements = driver.find_elements(By.XPATH, paragraph_xpath)  

テキストと属性の抽出

Web 要素への参照を取得すると、テキスト コンテンツや属性などのプロパティにアクセスできます。

heading_text = heading_element.text
print(heading_text)  
# Tired of getting blocked while scraping the web?

paragraph_id = paragraph_elements[0].get_attribute("id")

Selenium と XPath を使用してデータを抽出するのは非常に簡単ですが、Selenium は実際のブラウザを実行するため、通常の HTTP リクエスト ライブラリを使用するよりも遅いことに注意してください。

ヒントとベストプラクティス

Web スクレイピングに XPath の使用を開始する際に、留意すべきいくつかのヒントとコツを次に示します。

Chrome DevTools を使用して XPath 式をテストする

XPath セレクターを構築する場合、対話形式でテストして、期待したものと一致することを確認すると非常に便利です。 Chrome DevTools は、これを行うための簡単な方法を提供します。

  1. 要素を右クリックして「検査」を選択し、DevTools の要素パネルを開きます。
  2. Ctrl+F を押して検索ボックスを開きます
  3. XPath 式を入力して、ページ上の一致する要素を強調表示します。

一貫性のないマークアップの処理

実際の Web サイトには、一貫性がなかったり破損した HTML マークアップが含まれていることも多く、XPath セレクターがつまづいてしまう可能性があります。 lxml で解析する前に、BeautifulSoup のようなライブラリを使用して HTML をクリーンアップして正規化することをお勧めします。

堅牢で保守可能な XPath を作成する

ターゲット サイトのレイアウト変更によってスクレイパーが壊れる可能性を最小限に抑えるには、できるだけ具体的な XPath 式を作成するようにしてください。必要以上に具体的ではないようにしてください。マークアップの特定の構造に依存するよりも、タグ名、ID、データ属性などのセマンティック プロパティによって選択することを優先します。

可読性と保守性を向上させるために、複雑な XPath 式をわかりやすい名前を持つ変数に分割することもお勧めします。

結果をキャッシュしてパフォーマンスを向上させる

大量のデータをスクレイピングしている場合、または同じページに複数回アクセスしている場合は、不要なネットワーク要求と解析のオーバーヘッドを避けるために、解析された HTML および XPath の結果をキャッシュすることを検討してください。単純な辞書を使用することも、MongoDB や Redis などのより堅牢なソリューションをキャッシュに使用することもできます。

まとめ

XPath は、HTML ページからデータを正確に抽出するための非常に強力なツールです。構文の基本を理解し、CSS セレクターを XPath セレクターに相当するものに変換する機能があれば、さまざまな Web スクレイピング タスクを処理できます。

lxml、BeautifulSoup、Selenium などの Python ライブラリは、XPath をスクレイピング ワークフローに統合する簡単な方法を提供します。特定のニーズと対象サイトの特性に応じて、最適なアプローチを選択できます。

Python と XPath を使用して Web スクレイピングを続ける場合は、Web サイトの利用規約と robots.txt の制限を常に遵守してください。そして、XPath 関数と演算子の基礎を忘れずにブラッシュアップしてください。わずか数行の賢い XPath でどれだけ多くのことを達成できるかに驚くでしょう。

参加する

あなたのメールアドレスは公開されません。 必須フィールドは、マークされています *