top of page

本サイトはアフィリエイト広告を利用しています

検索

XPathでHTML要素を取得する

サイトから情報を取得するのにはXPathが便利です。


副業サイトではデータ収集や、サイト情報のスクレイピングなどが多くあるので、

これを覚えておくととても役立ちます。


XPathとは

サイトはHTMLで書かれています。

ブラウザがHTMLを読み取って、文字の大きさや色などの装飾を表現したり、

画像ファイルを参照して表示したりします。


ボタンやリンク、文字などをHTMLから検索するための記法ということになります。



何に使う?

HTMLからボタンなどを検索することで、そのボタンを操作したり、

文章を抜き出したりすることができます。


たとえば、グルメサイトから店舗情報ページに移動し、住所や口コミなどを取得する、

といった自動処理に利用できます。


同じ体裁で書かれているページを大量に処理する場合に便利です。



XPathを試す

プログラムを書かなくても、XPathの威力を簡単に確かめることができます。


  1. Google Chromeで任意のサイトを開き、「F12」を押す。(グルメサイトの店舗一覧ページなど)

  2. 開発者向けツールが開きます。

  3. 「Elements」タブをクリックすると、HTMLの中身が表示されます。

  4. 「Ctrl+F」で検索ボックスが開きます。

  5. 検索ボックスに「//div」と入力してみてください。

  6. 何かしらヒットしたと思います。これは、「div」タグの要素がすべて検索できた、ということになります。

  7. 「div」タグ内に「class」のある要素を見つけてください。

  8. 検索ボックスの中身を「//div[@class='<クラス名>'」に変更します。

  9. クラス名が一致する「div」要素のみが一致したと思います。

どうでしょうか。とても簡単に要素を見つけることができたと思います。

FindElementByClassNameと同じですが、XPathのほうが柔軟性があります。


FindElementだと取得した要素の子を探すためにループしたりとコードが長くなる場合が多いですが、

XPathなら必要な要素を狙い撃ちできます。



属性で取得する

タグ内に書かれている「class」「name」「id」「value」などを属性といいます。

これらは「@」指定で一致させることができます。


//div[@class='xxxxx']

//div[@name='xxxxx']

//div[@id='xxxxx']

//div[@value='xxxxx']


サイトによってはオリジナルの属性がある場合もありますが、それも同様に指定できます。

//div[@data-name-area='xxxxx']


テキストで取得する

タグに囲まれている内容を指定して取得することができます。

個人的には、ページ移動リンクを取得することが多いです。


<a href="xxxx">次へ</a>

を取得する場合は以下のように書きます。


//a[text()='次へ']


親を取得する

「parent::<タグ名>」で、指定したタグの親タグを取得できます。

親タグに特徴がない場合に、内部で特定して親にさかのぼる、という使い方をします。


<div>

<span id='xxxx'>aaaaa</span>

</div>


//span[@id='xxxx']/parent::div


となりのタグを取得する

「following-sibling::<タグ名>」で、指定したタグ以降にある隣接タグを取得できます。

「preceding-sibling::<タグ名>」で、手前のタグを取得できますが、

個人的にはこちらはあまり使いません。


<table>

<tr>

<th>住所</td>

<td>●●件●●市●●町</td>

</tr>

</table>


//th[text()='住所']/following-sibling::td


複数ヒットする場合は、インデックスを指定することで特定できます。

//th[text()='住所']/following-sibling::td[1]


インデックスは配列等と異なり、「1」から始まることに注意が必要です。


あいまいな検索

「contains」で、指定文字列を含む条件で検索できます。

表記ゆれのあるサイトで活躍します。


<tr>

<th>電話番号</th>

<td>xxx-xxxx-xxxx</td>

</tr>


//th[contains(text(), '電話')]


and, or, not

複数の条件を組み合わせることができます。


・「and」 2つの条件を両方とも満たす要素のみ。

//div[text()='xxxx' and @class='yyyy']


・「or」 2つの条件のどちらかを満たせばOK

//th[contains(text(), '電話') or contains(text(), 'TEL')]


・「not」 一致するものを除く

//div[not(@class='xxxx')]



まとめ

これまで100サイト以上のスクレイピングを行ってきましたが、

ここに書いてある内容だけで、必要なことはすべてできました。

and, or, notもほとんど使うことはありません。


簡単に覚えられるので、ぜひマスターしてみてください。


副業の入り口としてもデータ収集は手を付けやすいので、

以下のサイトで探してみるのも良いかもしれません。


ちょっとした手間で数千円~報酬になりますよ!



最新記事

すべて表示

Comments


bottom of page