XPath応用編 - 2.テーブルデータを指定する
フォローする一部のWebページではテーブルでコンテンツを表示しています。例えば、
- 店の詳細を紹介する口コミサイト(列見出し)
- 株価情報を紹介する株式ランキングサイト(行見出し)
Octoparseで行ごとにデータを抽出することはもちろんできますが、WebサイトのHTML構造が変わることで、違ったデータを取得したり、データが空白になったりする場合があると思います。
そのような場合にXPathをどのように書き直し、それからOctoparseでどう解決するかを紹介します。
1.行見出し
例:https://www.hotpepper.jp/strJ001259626/
今度はアクセスの後ろにくるテキストを指定します。
a) まずは「ブランド」をクリックします。それに応じて以下のHTMLと表示されます。
b) XPathの書き方で紹介した「contains(text(),"XXX")」を使って「アクセス」を指定すると、下記のように書くことができます。
//th[contains(text(),"アクセス")]
c) それから、XPathの書き方で紹介したfollowing-sibling::で次のテキストを指定することができます。
//th[contains(text(),"アクセス")]/following-sibling::td[1]
following-sibling::td[1]はth[contains(text(),"アクセス")]と同じ階層で、その後にくる1番目のtd要素を指定する意味です。
d) 上記のXPathをOctoparseのデータフィールドのXPath入力ボックスに入れ替えます。
2.列見出し
例:https://finance.yahoo.co.jp/stocks/ranking/up?market=all&term=daily
下記のようなテーブルは複数の列で行ごとにデータを表示しています。
このようなサイトでは列数に変化はなく、行数に増えたり減ったりする変化があります。
今度は指定した行目と列目のデータを取得するXPathの書き方を説明します。
a) まずは順位に「1」のところを確認します。tr属性のところにマウスを移動すれば、一行目の内容を指定することができます。それに応じて以下のHTMLと表示されます。
b) 他の行目もすべてtr属性で記述されています。tr属性で指定すると、すべての行を指定できます。XPathを下記のように書くことができます。
//tr[@class="WRru9z7J"]
一行目を指定したい場合はXPathを下記のように書くことができます。
//tr[@class="WRru9z7J"][1]
c) 各行を指定する上記のXPathをOctoparseのループアイテムのXPath入力ボックスに入れ替えます。
d) それから、列目を指定します。例えば、1列目の「順位」を指定したい場合はXPathを下記のように書くことができます。
//tr[@class="WRru9z7J"]/th
1列目はtr要素の下にくる1番目のth要素です。そのため、trの下にあるthを指定すれば、「順位」列を指定できます。
2列目の「コード」と「市場」を指定する場合はXPathもそれぞれ下記のように書くことができます。
//tr[@class="WRru9z7J"]/td[1]
//tr[@class="WRru9z7J"]/td[2]
e) 各行を指定する上記のXPathをOctoparseのデータフィールドの相対XPath入力ボックスに入れます。
続きを読む