Excelとちょっと違った便利機能が豊富なGoogleDocs SpreadSheet。今日はその中でも非常に便利なimportxml機能についてご紹介します。
importXMLとは、簡単に言うと指定したURLの指定した箇所のテキストデータを取ってこれる超便利な関数。まさにウェブツールって機能ですね!
毎日会社の株価を調べてExcelにまとめるのが辛いんです…
そういう単純作業はこのImportXML関数を使うのがいいと思う!
使い方
例えばYahoo!ファイナンスから指定した株価の最新値を取ってくるには…
=IMPORTXML(“http://stocks.finance.yahoo.co.jp/stocks/detail/?code=1570.T”,”//td[@class=’stoksPrice’]”)
ってやると日経レバETFの現在値が取ってこれます。簡単。
そして、これ使うときにxPathって値を2番めの引数にしないといけないんですが、こいつを入れるのにChromeのデバッグツールから指定箇所のcopy xPathを選んでペーストしたらOK!って書いてあるサイトがとても多いんですが、これほとんど成功しないんです。というわけで、今回はその解説。
まずYahoo!ファイナンスの日経レバETFのURLを例にして…
http://stocks.finance.yahoo.co.jp/stocks/detail/?code=1570.T
こいつの現在株価を選択してChromeのcopy xPathを選択します。
//*[@id=”stockinf”]/div[1]/div[2]/table/tbody/tr/td[2]
そしこれをimportXMLの引数に入れる時に注意するのは、
ダブルクォートをシングルクォートに変える。まずこれです。
//*[@id=’stockinf’]/div[1]/div[2]/table/tbody/tr/td[2]
で、URLとxpathを入れて…
#N/A!
ふざけんなよ!もうシラネ!で挫折する人が多いと思うんです。
実は楽なのxpathの指定の仕方
ここでxpathとは何なのかを考えてみましょう。
XPath は、XML文書内で、特定のノードの位置を指定することを目的とした構文です。 XMLデータはツリーとしてモデル化でき、また、要素や属性などXMLデータを構成する各パーツは、ツリーを構成するノードとしてモデル化できます。
エンジニアじゃないから何言ってるのかノードの時点でわからないです!
簡単に言うと、持ってきたい値のHTMLソース内での場所を書けばいいわけです。上の例では、Chromeでコピペした
//*[@id=”stockinf”]/div[1]/div[2]/table/tbody/tr/td[2]
じゃなくて、
//td[@class=’stoksPrice’]
が正しいのです。ソースを見ると
13,130
となっています。td のclassであるstoksPriceはHTML内にこの部分しかないので、13,130が取得できるわけです。
ではこの調子で別の数値も持ってきてみましょう。
昨日の株価を取得します。
=IMPORTXML(“http://stocks.finance.yahoo.co.jp/stocks/detail/?code=1570.T”,”//div[@class=’lineFi clearfix’][1]/dl/dd[@class=’ymuiEditLink mar0′][1]/strong[1]”)
これが正解。
見ていただくとわかるんですが、div class=lineFi clearfixの下のdlの下のdd class umuiEditlink mar0の下のstrongの値と指定しています。じゃぁ[1]ってなんでしょう。試しに[1]を全部取ります。
=IMPORTXML(“http://stocks.finance.yahoo.co.jp/stocks/detail/?code=1570.T”,”//div[@class=’lineFi clearfix’]/dl/dd[@class=’ymuiEditLink mar0′]/strong”)
すると…
12,710
13,050
13,140
12,910
18,412,871
239,886,717
9,710~15,710
なんかいっぱい出てきましたね
これは、div class=lineFi clearfixの下のdlの下のdd class umuiEditlink mar0の下のstrongの値がいっぱいあるからです。この中で欲しいのは1番上の12,710なので、[1]と指定するわけです。なんだよそれじゃぁstrongの1番目だけでいいのでは?思って
=IMPORTXML(“http://stocks.finance.yahoo.co.jp/stocks/detail/?code=1570.T”,”//div[@class=’lineFi clearfix’]/dl/dd[@class=’ymuiEditLink mar0′]/strong[1]”)
こうすると…
12,710
13,050
13,140
12,910
18,551,080
241,693,668
9,710~15,710
同じです。なんでこうなるかというと、lineFi cleafix配下にデータが同じように格納されているから。つまり、昨日値は1番目のdiv class=lineFi clearfixの下の1番目のdlの下の1番目のdd class umuiEditlink mar0の下の1番目のstrongって指定してあげると正常に取得できるんですね!
一部抜粋ですが元ソースこんな感じ
<div class="lineFi clearfix"> <dl class="tseDtlDelay"><dd class="ymuiEditLink mar0"><strong>12,710</strong><span class="date yjSt">(01/29)</span></dd> <dt class="title">前日終値<a class="tips alignPos" href="http://rdsig.yahoo.co.jp/finance/stocks/detail/116trm/RV=1/RU=aHR0cDovL2luZm8uZmluYW5jZS55YWhvby5jby5qcC9kaWN0aW9uYXJ5Lw--" onMouseOver="showTips('zenjituowarine');" onMouseOut ="hideTips('zenjituowarine');"><img src="http://i.yimg.jp/images/finance/common/image/btn_yougo.png" onmouseover="this.src='http://i.yimg.jp/images/finance/common/image/btn_yougo_on.png'" onmouseout="this.src='http://i.yimg.jp/images/finance/common/image/btn_yougo.png'"></a> <span class="tips yjSt" id="zenjituowarine">前営業日、最後の取引値</span></dt> </dl> </div> <div class="lineFi clearfix"> <dl class="tseDtl"><dd class="ymuiEditLink mar0"><strong>13,050</strong><span class="date yjSt">(09:03)</span><span class="icoRealTime" title="リアルタイム"> </span></dd> <dt class="title">始値<a class="tips alignPos" href="http://rdsig.yahoo.co.jp/finance/stocks/detail/116trm/RV=1/RU=aHR0cDovL2luZm8uZmluYW5jZS55YWhvby5jby5qcC9kaWN0aW9uYXJ5Lw--" onMouseOver="showTips('hajimarine');" onMouseOut ="hideTips('hajimarine');"><img src="http://i.yimg.jp/images/finance/common/image/btn_yougo.png" onmouseover="this.src='http://i.yimg.jp/images/finance/common/image/btn_yougo_on.png'" onmouseout="this.src='http://i.yimg.jp/images/finance/common/image/btn_yougo.png'"></a> <span class="tips yjSt" id="hajimarine">その日はじめについた値段</span></dt> </dl> </div>
以下略ですが、こんなのが5回繰り返されてるわけです。
同じ構造の中に違うデータが入ってるのが5セットあるので、何番目かを指定してあげないと何個も値が表示されるということです。
まとめ
ちなみに、昔は1シート50回までの使用制限があったみたいだけど今は無いのでたくさん使えます。[1]の値を[2]にすれば2番めの値が取れます。応用することで検索キーワードランキングなんかも取得できるのでSEOの分析シートにもいいですね。GRCがいらなくなるってことは無いと思いますが、簡単なデータ取得ならいいんじゃないでしょうか?