第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のタイトルを指定したいとします。
Google ChromeでWebページを開きます。
抽出するh1のテキスト部分を選択します。
右クリックして「検証」を選択します。
必要なHTMLコードを選択し、[Copy]、[Copy XPath]の順に選択します。
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を取得します。
書籍の詳細ページ
ここからは書籍の詳細ページの中身の情報を全部、取得します。

パンくずリストの商品名
パンくずリストのパンくずと商品名を取得します。
商品画像のURL
商品画像のURLを取得します。
商品名、金額、ステータス
商品名、金額、ステータスを取得します。
説明文のタイトルと説明文
説明文のタイトルと説明文を取得します。クラスがproduct_descriptionのノードと同じ階層にあり、かつ後に出てくる兄弟ノードのpの集合からテキストを取得します。
商品の情報一覧
商品の情報一覧をすべて取得します。
同じことを繰り返し書くの大変なので、テーブルなんかは名前を変更するだけで値がとれるので、そのための関数を書いておくと便利です。
最終更新
役に立ちましたか?