【Python】WebスクレイピングのためのXPath

Python

スクレイピングをするのに必要となる、HTMLからの要素取得方法であるXPathについてまとめました。

XPathの基本

xpathの結果についてはこちらのサイトで試すことができる。

XPath Playground

以下コードを例にpathの書き方を確認していきます。

<html>
    <head>
        <title>xpathの書き方</title>
    </head>
    <body>
        <p class="title">
            <b>xpathの書き方には以下の種類があります</b>
        </p>
        <p class="variation">
            <a class="kind" href="https://www.sample1" id="link1">
                タグで指定
            </a>
            <a class="kind" href="http://www.sample2" id="link2">
                属性で絞り込み
            </a>
            <a class="kind" href="http://www.samplel3" id="link3">
                テキストで絞り込み
            </a>
        </p>
    </body>
</html>

基本的な指定の仕方

titleのテキストを取得する場合

/html/head/title/text()

> xpathの書き方

pathを省略する場合
//title/text()

属性で絞る方法

id属性の”link1″のみ取得する場合

//a[@id="link1"]

><a class="book" href="https://www.sample1" id="link1"> タグで指定 </a>

更にその中のurlのみを取得する
//a[@id="link1"]/@href

> https://www.sample1

属性に含まれる要素で絞り込み

aタグにsample1を含む要素を取得する
contains(属性, 属性値)

例
//a[contains(@href,"sample1")]

> <a class="book" href="https://www.sample1" id="link1"> タグで指定 </a>

divタグにsample1のclassを持つ要素を取得する
例
//div[contains(@class, "sample1")]

aタグで、sample1を持たない要素を取得

notを使用する

//a[not(contain(@href,"sample1"))]

> 
<a class="book" href="http://www.sample2" id="link2"> 属性で絞り込み </a>
<a class="book" href="http://www.samplel3" id="link3"> テキストで絞り込み </a>

他にも、andやorを使用することもできる。

前方一致検索

https:://wwwで始まる要素を取得する。

//a[starts-with(@href,"https://www")]

> <a class="book" href="https://www.sample1" id="link1"> タグで指定 </a>

後方一致検索の場合は、starsの部分をendsに変えるだけ。

テキストに含まれる要素で絞り込み

aタグで、テキストに「指定」を含む要素を取得する

//a[contains(text(),"指定")]

> <a class="book" href="https://www.sample1" id="link1"> タグで指定 </a>

リスト要素の取得

こちらを例に見ていきます。

<ul class="kind">
  <li>スクレイピング</li>
  <li>データサイエンス</li>
  <li>機械学習</li>
</ul>

リストを取得する

リスト要素を取得する場合は親のulから指定する。

//ul[@class="kind"]/li

>
Result
<li>スクレイピング</li>
<li>データサイエンス</li>
<li>機械学習</li>

リストの中から指定する

1行目を指定する

//ul[@class="kind"]/li[1]

またはpositionを使う
//ul[@class="kind"]/li[position()=1]

>
Result
<li>スクレイピング</li>

positionを使うと複数選択する事もできる。

1行目と2行目を指定

//ul[@class="kind"]/li[position()=1 or position()=2]

>
<li>スクレイピング</li>
<li>データサイエンス</li>

リストの最後を取得する

lastを使用する。

//ul[@class="kind"]/li[position()=last()]

> <li>機械学習</li>

自分自信を基準に前後の要素を取得する

自分自信より前の要素を取得する

以下のコードを例に

<html>
    <head>
        <title>xpathの書き方</title>
    </head>
    <body>
        <p class="title">
            <b>xpathの書き方には以下の種類があります</b>
        </p>
        <p class="variation">
            <a class="kind" href="https://www.sample1" id="link1">
                タグで指定
            </a>
            <a class="kind" href="http://www.sample2" id="link2">
                属性で絞り込み
            </a>
            <a class="kind" href="http://www.samplel3" id="link3">
                テキストで絞り込み
            </a>
        </p>
    </body>
</html>

親要素を取得する

//a[@id="link2"]/parent::p

>
<p> <a class="book" href="https://www.sample1" id="link1"> タグで指定 </a> 
<a class="book" href="http://www.sample2" id="link2"> 属性で絞り込み </a> 
<a class="book" href="http://www.samplel3" id="link3"> テキストで絞り込み </a> </p>

この場合、親がpタグとわかっているが、わからない場合はnode()として同じ出力結果を得ることもできる

//a[@id="link2"]/parent::node()

指定した要素の親の持つ要素を取得するにはparentを使う。

先祖要素を取得する場合

parentをancestorとする。

この場合、自分自信は含まい。

含ませたい場合はselfを使う

//a[@id="link2"]/ancestor-or-self::node()

自分自信より後の要素を取得する

子要素の取得

childを使う。

//p[@class="variation"]/child::a

または

//p[@class="variation"]/child::node()

>
<a class="kind" href="https://www.sample1" id="link1"> タグで指定 </a>
<a class="kind" href="http://www.sample2" id="link2"> 属性で絞り込み </a>
<a class="kind" href="http://www.samplel3" id="link3"> テキストで絞り込み </a>

後続のすべての要素を取得

followingを使う

//p[@class="variation"]/following::node()

後ろの兄弟要素を取得

//p[@class="variation"]/following-sibling::node()

子孫要素を取得

descendantを使う。

//p[@class="variation"]/descendant::node()

コメント