プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Python
  • スクレイピングにおけるXPathの基本
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

スクレイピングにおけるXPathの基本

06.04

  • miyabisan2
  • コメントを書く

この記事は3分で読めます

XPathとは?

XMLやHTMLなどから欲しい部分を指定して取得することができる簡易言語です。XSLTなどでXML操作に利用されるのはもちろん、現在はスクレイピング用途でも幅広く利用されています。

XPathのメリット

CSSセレクタで取得する場合に比べてXPathの方が若干要素の指定が柔軟にできます。

  • 階層構造を辿って要素を指定する。
  • 正規表現を使って要素を指定する。

XPathのデメリット

  • Scrapyでは使えますが、BeautifulSoupでは使えない。

XPath Playground

手軽にXPathを試せます。

https://scrapinghub.github.io/xpath-playground/

基本

ロケーションパス

要素までの階層の道のりを示したものを呼びます。

例えば、h2などの各要素はノードテストと呼びます。スラッシュで区切ると階層を辿ることが可能です。これを

1
/ノードテスト/ノードテスト/ノードテスト

最初から取得

1
/html/body/h2

途中から取得

スラッシュ2つであれば、直接要素にアクセスできます。

1
//h2

軸

軸とは、親、子、子孫、先祖など様々な要素を指定できるロケーションパスの指定法です。

1
/軸::ノードテスト/軸::ノードテスト

軸 説明
parent 親要素(子孫要素も含めて)取得します。
1
//a[@id='link1']/parent::node()
ancestor 先祖要素(子孫要素も含めて)全て取得します。(取得結果は複数になります。)
1
//a[@id='link1']/ancestor::node()
ancestor-of-self 自分自身も含めた先祖要素を全て取得します。(ancestorと違い、取得する複数の結果の中に自分自身のnodeも追加されるイメージです。)
1
//a[@id='link1']/ancestor-or-self::node()
preceding 先祖を除く全ての前の要素。(例えばHTMLで言えば、全ての要素の先祖であるhtmlタグは絶対に取得されることはないです。)
1
//a[@id='link1']/preceding::node()
preceding-sibling 前にある全ての兄弟要素(つまり、同じ階層の前の要素)
1
//a[@id='link2']/preceding-sibling::node()
child 子要素
1
//p[@class='recent books']/child::node()
following 後ろの全ての要素
1
//a[@id='link1']/following::node()
following-sibling 後ろにある兄弟要素
1
//a[@id='link1']/following-sibling::node()
descendant 後ろの子孫要素
1
//p[@class='title']/descendant::node()
descendant-or-self 自分自身を含む後ろの子孫要素
1
//p[@class='title']/descendant-or-self::node()
self 自分自身の要素
1
//p[@class='title']/self::node()
attribute 自分自身の属性の値を出力
1
//p[@class='title']/attribute::node()

なお、祖先であれば祖父はもちろんですが、親も含みますし、子孫であれば孫はもちろんそうですが、子も含みます。

属性の指定して要素を特定する。

1
要素[@属性=属性値]

以下のHTMLがあるとする。

1
<a class="item is-active" href="/">テスト</a>

以下のように指定する。

1
//a[@class="item is-active"]

テキストを取得する。

1
2
3
//a[@class="item is-active"]/text()
 
テスト

属性の値を直接取得

1
要素/@属性

上記のように指定すれば属性の値を直接取得できます。

1
//h3/a/@href

こうすればh3の下にあるaタグのhref属性の値を取得できます。

要素を絞り込む

含む

containsという述語を利用します。例えば、href属性(URL)の中に「A07TN4D3HG」というコードが含まれている要素だけを抽出したい場合は以下のように指定します。

1
//a[contains(@href,"A07TN4D3HG")]

テキスト検索

1
//a[contains(text(),"Python")]

なお、テキスト検索は大文字小文字を区別するので注意が必要です。

含まない

1
//a[not(contains(@href,"A07TN4D3HG"))]

notという述語で囲えば逆に含まない要素を検索できます。

複数条件での絞り込み

以下は、hrefにA07TN4D3HGを含みかつidにlink2を含む場合を示しています。

1
//a[contains(@href,"A07TN4D3HG") and contains(@id,"link2")]

前方一致検索

1
//a[starts-with(@href,"http://www.amazon.co.jp/dp/B07SRLR")]

後方一致検索(XPath2.0以降のみ)

1
//a[ends-with(@href,"4M")]

XPath2.0以降しか対応していないので対応していないブラウザも多いのであくまで参考までです。

list要素の取得方法

番号を指定して取得

前から何番目の値を取得するか指定している。

1
//li[position() =2]

もしくは以下のようにも書けます。この方が簡潔なので望ましいです。

1
//li[2]

最後の要素を取得

1
//li[position() =last()]

三番目以降の要素を取得

大なり記号も使えます。

1
//li[position() >2]

 

 

スポンサーリンク
  • 2023 06.04
  • miyabisan2
  • コメントを書く
  • Python
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2023 05.28

    【Python】「BeautifulSoup」について

  2. 2023 05.26

    【Python】主流のスクレピングライブラリ

  3. 2023 06.11

    【Python】スプレットシート操作

  4. 2023 06.12

    【Python】「Jupyter Notebook」とは?

  5. 2023 05.30

    【Python】Anacondaの使い方メモ

  6. 2023 08.13

    【Lambda】PythonでLamda関数を定義して実行する

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Python】Scrapyのコマンド、開発の流れ

【Python】Scrapyでspiderを作成する流…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー