第5章 Scrapy ShellとXpath

はじめに

ここではXpathについてまとめておきます。Xpathの概要に始まり、Xpathを取得する方法、そして、実際にXpathを記述して取得していきます。

Xpathとは

XPath (XML Path Language)は、XML形式のドキュメントから、特定の部分を指定して抽出するための言語です。HTML形式のドキュメントにも対応するため、これを使うことで、Webページの特定の部分をスクレイピングできます。

基本的な文法は下記のとおりです。Wikipediaにも豊富に記述がありますし、下記の記事は非常にわかりやすいです。

Xpath

内容

.

カレントノードを示します

//*

全ての要素を選択

.//

カレントノードから開始する要素を選択

@

@は属性を指定する場合に使用

.//div

カレントノードの下のdiv要素を選択

.//li[a]

カレントノードの下のli要素を含むa要素を選択

.//div[@class='quotes']

カレントノードの下のdiv要素のクラスがquotesを選択

.//*[text()='Next']

Nextという文字列を選択

//a[contains(text(), ‘Next’)]

Nextという文字列を含むa要素を選択

.//*[contains(@class, 'Next')]

Next”という文字列を含むクラス属性を選択

//h1/following-sibling::p[1]

h1要素の下の1番目の要素を選択

Xpathの取得方法

Google ChromeでXPathを取得する簡単な方法を紹介します。ここではh1のタイトルを指定したいとします。

  1. Google ChromeでWebページを開きます。

  2. 抽出するh1のテキスト部分を選択します。

  3. 右クリックして「検証」を選択します。

  4. 必要なHTMLコードを選択し、[Copy]、[Copy XPath]の順に選択します。

  5. XPathをコードに貼り付け、テストし、必要に応じて編集します。

Getting Xpath

コピーすると、下記のようなXpathが取得できます。これを参考にXpathを記述します。

もちろんフルパスで指定しなくても特定できるのであれば、省略が可能です。

Scrapy ShellでXpathを理解する

XpathをChromeでコピーして、そのままペーストすればうまくいくことは、個人的な経験だとあまり多くはないので、Xpathを記述できるようになっておくほうが良いと思います。

Scrapy Shellを使って、下記のサイトのすべての値を取得する方法をまとめておきます。

タイトル

タイトルの「Books to Scrape We love being scraped!」を取得します。

Homeボタン

タイトルの下にあるHomeボタンの文字とURLを取得します。

Homeボタン横の文字

タイトルの下にあるHomeボタンの横の「All products」の文字を取得します。

ナビゲーションのタイトル

左端のナビゲーションのタイトルの「Book」の文字とURLを取得します。

ナビゲーションのリスト

左端のナビゲーションのリストの文字とURLを取得します。

書籍一覧のタイトル

書籍一覧のタイトルの「All products」という文字を取得します。

ページャの部分

書籍一覧のタイトルの下の「1000 results - showing 1 to 20.」の部分を取得します。ソースを見るとこれ以上辿れないので、following-sibling::text()で子孫を取得するようにしています。

ワーニングの部分

書籍一覧のタイトルの下の「ワーニング」の文字列を取得します。

書籍の画像のURL

書籍の画像のURLを取得します。画像のURLを取得できれば、Scrapyで画像のダウンロードも可能です。

書籍のタイトル

書籍のタイトルを取得します。

レビューの星

レビューの星の数を取得します。ソースを見るとわかりますが、一筋縄ではいかないので、contains(@class, "star-rating")]として、star-ratingを含むクラスを取るようにしています。

書籍の金額

書籍の金額を取得します。

書籍の在庫ステータス

書籍の在庫ステータス「In stock」を取得します。これで取ると、同じ階層のiタグの空テキストも入るので20個のはずが40個返ってきます。

なので、1つ上の階層からfollowing-sibling::text()でノードと同じ階層にあり、かつ後に出てくる兄弟ノードの集合を取ります。後は改行と空白を削除します。

カートに入れるボタン

カートに入れるボタンの文字を取得します。

1番下のページャ

1番下のページャの文字を取得します。

1番下のNextボタン

1番下のNextボタンの文字とURLを取得します。

書籍の詳細ページ

ここからは書籍の詳細ページの中身の情報を全部、取得します。

Book Detail

パンくずリストの商品名

パンくずリストのパンくずと商品名を取得します。

商品画像のURL

商品画像のURLを取得します。

商品名、金額、ステータス

商品名、金額、ステータスを取得します。

説明文のタイトルと説明文

説明文のタイトルと説明文を取得します。クラスがproduct_descriptionのノードと同じ階層にあり、かつ後に出てくる兄弟ノードのpの集合からテキストを取得します。

商品の情報一覧

商品の情報一覧をすべて取得します。

同じことを繰り返し書くの大変なので、テーブルなんかは名前を変更するだけで値がとれるので、そのための関数を書いておくと便利です。

最終更新

役に立ちましたか?