Webページ上の情報は、よく「テーブル形式(表形式)」で表示されています。たとえば:
お店情報が表で表示される口コミサイト
株価が行単位で並ぶランキングページ
こうしたページから欲しいデータを確実に抽出するには、XPathをちょっと工夫して書くのがコツです。本記事では、「行見出し」や「列見出し」を使ってテーブル内のデータを正確に指定する方法を、具体例とともに紹介します。
Octoparseでは、テーブルの行ごとにデータを抽出することが可能です。ただし、別のページ(たとえば同じサイト内の他の店舗ページなど)では、HTMLの構造が微妙に異なることがあり、その結果、正しくデータを取得できなかったり、空白になってしまう場合があります。
この記事では、そうしたケースでXPathをどのように書き換えればよいか、そしてOctoparse上でどのように対応すればよいかを紹介します。
パターン①:「行見出し」でデータを取得する
🎯 目標:ラベルに続くデータをピンポイントで取る
例:https://www.hotpepper.jp/strJ001259626/
このページには「アクセス」「営業時間」などの見出し(thタグ)と、内容(tdタグ)が対になっています。
🛠 手順:
1) XPathの書き方で紹介した contains(text(),"XXX") を使って「アクセス」を指定する
//th[contains(text(),"アクセス")]
2) XPathの書き方で紹介した following-sibling:: で、そのすぐ後ろにある値を指定
//th[contains(text(),"アクセス")]/following-sibling::td[1]
📌 解説:
following-sibling::td[1] で、「アクセス」という見出しのすぐ右にあるデータを指定しています。
2.パターン②:「列見出し」でデータを取得する
例:https://finance.yahoo.co.jp/stocks/ranking/up?market=all&term=daily
このようなページでは、各行が企業情報1件分を表し、列に「順位」「コード」「市場」などの情報が並んでいます。
🛠 手順:
1) 行を指定(例:すべての行)
//tr[@class="WRru9z7J"]
特定の行だけなら、以下のように数字を指定:
//tr[@class="WRru9z7J"][1]
2) 列を指定(例:順位、コード、市場)
//tr[@class="WRru9z7J"]/th ← 1列目(順位)
//tr[@class="WRru9z7J"]/td[1] ← 2列目(コード)
//tr[@class="WRru9z7J"]/td[2] ← 3列目(市場)
3)Octoparseへの入力ポイント
行XPath → ループアイテムの「XPath」欄に
列XPath → データフィールドの「相対XPath」欄に
💡補足Tips
contains(text(),"xxx") を使うと、部分一致で柔軟に指定できます。
following-sibling:: で同階層の次の要素をとれます。
テーブル構造が崩れても、近くのテキストを手がかりにすれば安定して取れます。
✨おまけ:XPathが使えると何が嬉しい?
レイアウトが変わっても柔軟に対応できる
自動化の安定性がぐっと上がる
めんどうな設定がスマートになる
続きを読む