スクレイピングをするのに必要となる、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()
コメント