webスクレイピングを知識0から始めて習得するま⑥【XPathとCSSセレクタの基本】

2022/1/22【6日目】

XPathとCSSセレクタのちがい

いずれかをマスターをすれば大丈夫。両方マスターする必要はない。CSSセレクタの方が理解しやすいという声もあるがどちらもあまり変わらない。XPathの方が柔軟に要素を指定できる。

私は、柔軟に要素を指定できると後々困ることも少ないと思うのでXPathで進めていこうと思います。

XPathとは

XML Path Languageの略。XML形式の文書から要素を抽出するための簡易言語。htmlにも使える。

柔軟に要素を指定できるが、その分理解することは多くなる。BeautifulsoupではXPathで指定できない。

XPathとは、XPathの基本的な書き方

HTMLの階層構造

html- head- title- テキスト
        |- body- p
                     |- p

HTMLタグの属性

<a class(属性)="book"(属性値) id="link1">テスト</a>
aタグの中にはclass属性として属性値bookが含まれている。idもid属性として属性値link1が含まれている。

XPathの基本的な書き方

ロケーションパス:/ノードテスト/ノードテスト/ノードテスト

画像1

このサイトでXPathをためすことができる。
Inputの入力欄でhtmlコードを入力しておく。XPath欄に条件を入力。Resultに結果が出る。

画像2

Chromeでhtmlを表示して、Inputにコピペ。

XPathの基本

htmlのルートからXPathを書く場合はスラッシュを使って記述する。

html-head-titleと辿ってタイトル要素を指定する場合は、

/html/head/title

画像3

このように書くと、タイトルタグとその中に含まれるテキストが表示されてた。要素に含まれるテキストを表示したい場合は、

/html/head/title/text()

画像4

text()で、テキストのみ取得できる。

画像5

// ダブルスラッシュを使うと、途中のパスを省略できる。

画像6

a要素は複数あるので、複数表示される。その中で1つに絞り込みたい場合は、親要素は省略せずに記述するか、属性と合わせて指定する必要がある。

XPathによる属性の取得

画像7

a要素はid属性としてlink1、link2、link3を持つものそれぞれある。

画像8

これで、id属性がlink1を持つa要素だけを指定できる。

画像9

任意の属性を指定する場合は*を使う。

画像10

属性値を表示したい場合は、@を使う。href属性の値として格納されているURLを表示できた。

画像11

URLについている10桁の商品コードで絞り込むときは、containsを使う。

画像12

not(contains())を使うと、含まない要素を指定できる。

画像13

and contains(@)でid属性の条件を追加。

画像14

orを使うと、商品コードとid属性で指定できる。

画像15

stars-withで前方一致検索ができる。httpsのURLは除かれた。

画像16

ends-withで後方一致検索ができる。この方法はXPath2.0以降に対応していてChrome等では使えないから参考までに。

画像17

containsは、テキストに含まれる文字列も検索できる。大文字小文字の別もあるので注意。

xpathでのリストの要素の取得

画像18

このサンプルhtmlを使っていきます。

画像19

これでulが抽出できた。

画像20

これでliが抽出できた。

画像21

画像22

[ ]に番号を入力するか、[position()=番号]でリストの要素を取得できる。

画像23

positionであれば複数要素の取得もできる。[ ]だとできない。

画像24

最後の要素の指定はlast()でもできるけど、最初の要素は1。

画像25

position()>1で2以降の要素取得。

XPathでの親・先祖・兄弟・子・子孫要素の取得

/軸::ノードテスト[述語]/ノードテスト/軸::ノードテスト
でロケーションパスを指定する。

画像26

XPathによる前方にある要素の取得

画像27

画像33

id属性が"link2"のa要素を自分要素とする。

画像28

親要素pの中身が取得できた。

画像29

親要素がわからない場合は、node()を使うと同じように取得できる。

画像31

先祖要素を取得するにはancestor()を使う。自分自身は含まれない。

画像31

ancestor-or-selfとすることで自分自身も含まれる。

画像32

自分自身の前にある先祖要素を除いた全ての要素の取得には、precedingを使う。

画像34

自身より前にある全ての兄弟要素の取得には、preceding-siblingを使う。

XPathによる後方にある要素の取得

画像35

自分自身をclass属性がresent booksのp要素とする。

画像36

子要素の取得にはchildを使う。子要素がわからない場合は親と同じように、node()を使う。

画像37

後続の全ての要素を取得するにはfollowingを使う。

画像38

後続の兄弟要素取得にはfollowing-siblingを使う。

画像39

後続にある全ての子孫要素を取得するには、descendantを使う。子と孫も取得できた。自分自身も含めるにはdescendant-or-selfを使う。

画像40

自分自身を取得するにはselfを使うが、通常は省略されて、
//p[@class="recent books"] と記述する。

画像41

自分自身の属性の値を取得。

xpathの指定方法は以上。このブログではxpathを用いていくので、CSSセレクタの指定方法については割愛します。



「Codes&Co.」「コーズコー」

この記事が気に入ったらサポートをしてみませんか?