メインコンテンツにスキップ

XPath応用編 - 2.テーブルデータを指定する

1か月以上前に更新

Webページ上の情報は、よく「テーブル形式(表形式)」で表示されています。たとえば:

  • お店情報が表で表示される口コミサイト

  • 株価が行単位で並ぶランキングページ

こうしたページから欲しいデータを確実に抽出するには、XPathをちょっと工夫して書くのがコツです。本記事では、「行見出し」や「列見出し」を使ってテーブル内のデータを正確に指定する方法を、具体例とともに紹介します。

  • 店の詳細を紹介する口コミサイト(列見出し)

  • 株価情報を紹介する株式ランキングサイト(行見出し)

    mceclip2.png

Octoparseでは、テーブルの行ごとにデータを抽出することが可能です。ただし、別のページ(たとえば同じサイト内の他の店舗ページなど)では、HTMLの構造が微妙に異なることがあり、その結果、正しくデータを取得できなかったり、空白になってしまう場合があります。

この記事では、そうしたケースでXPathをどのように書き換えればよいか、そしてOctoparse上でどのように対応すればよいかを紹介します。


パターン①:「行見出し」でデータを取得する

🎯 目標:ラベルに続くデータをピンポイントで取る

例:https://www.hotpepper.jp/strJ001259626/

このページには「アクセス」「営業時間」などの見出し(thタグ)と、内容(tdタグ)が対になっています。

ブラウザで「検証ツール」を開くと、HTMLが表示されます。

click-to-open.gif

mceclip1.png

🛠 手順:

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件分を表し、列に「順位」「コード」「市場」などの情報が並んでいます。

mceclip2.png

🛠 手順:

1) 行を指定(例:すべての行)

//tr[@class="WRru9z7J"]

特定の行だけなら、以下のように数字を指定:

//tr[@class="WRru9z7J"][1]

table.gif

2) 列を指定(例:順位、コード、市場)

//tr[@class="WRru9z7J"]/th          ← 1列目(順位)
//tr[@class="WRru9z7J"]/td[1] ← 2列目(コード)
//tr[@class="WRru9z7J"]/td[2] ← 3列目(市場)

table.gif

3)Octoparseへの入力ポイント

  • 行XPath → ループアイテムの「XPath」欄に

  • 列XPath → データフィールドの「相対XPath」欄に

💡補足Tips

  • contains(text(),"xxx") を使うと、部分一致で柔軟に指定できます。

  • following-sibling:: で同階層の次の要素をとれます。

  • テーブル構造が崩れても、近くのテキストを手がかりにすれば安定して取れます。

✨おまけ:XPathが使えると何が嬉しい?

  • レイアウトが変わっても柔軟に対応できる

  • 自動化の安定性がぐっと上がる

  • めんどうな設定がスマートになる

続きを読む

こちらの回答で解決しましたか?