Google Docs スプレッドシートのimportXMLの使い方

シェアする

十年以上Excel厨だったんですが、最近もっぱらGoogle Docs スプレッドシートをよく使ってます。その中でも、やっぱExcelじゃなくてオンラインツールならでは!ってのがimportXML。

importXMLとは、簡単に言うと指定したURLの指定した箇所のテキストデータを取ってこれる超便利な関数。こいつの使い方をメモってみました。

使い方

例えば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データを構成する各パーツは、ツリーを構成するノードとしてモデル化できます。

ごめん、エンジニアじゃないから何言ってるのかノードの時点でわからないw

簡単に言うと、持ってきたい値の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

なんかいっぱい出てきたw
これは、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って指定してあげると正常に取得できるんですね!(ホントはもっと短くスマートに入れられるんだろうけど、自分にはわかりませんでした)

一部抜粋ですが元ソースこんな感じ

以下略ですが、こんなのが5回繰り返されてるわけ。
同じ構造の中に違うデータが入ってるのが5セットあるので、何番目かを指定してあげないと何個も値が表示されるということです。

ちなみに、昔は1シート50回までの使用制限があったみたいだけど今は無いのでたくさん使えます。[1]の値を[2]にすれば2番めの値が取れます。応用することで検索キーワードランキングなんかも取得できるのでSEOの分析シートにもいいですね。GRCがいらなくなるってことは無いと思いますが、簡単なデータ取得ならいいんじゃないでしょうか?

スポンサードリンク
 
シェアする