Googleスプレッドシートのimportxml関数をhtmlに使う

 importxml関数は前回記したようにxmlを出力するAPIを利用することが出来る。前回の記事『Googleスプレッドシートのimportxml関数でWikipedia API(単語の各言語表記を取得)

Googleスプレッドシートにはimporthtmlという関数もあるが、こちらはhtml内にある表やリストを指定して取得する関数であり、使いみちが限られる。(まともに使ったことがないので詳細不明)

htmlに対しての利用

importxml関数はhtmlに対しても使用できる。

例えば前回APIで取得したWikipediaの情報をAPIを使わずにhtmlから直接取得してしまうことも出来る。(通常APIを用意してあるサイトはAPIを用いて取得すべきなので、これはあくまで例として掲載しているのみであり、APIが用意されているサイトをhtmlでの取得はしないほうが良い)




=IMPORTXML("https://ja.wikipedia.org/wiki/"&B6&"","//title")

この例だとB6セルに入力したWikipediaの記事名のページからxpath でtitleタグを取得するよう指定しており。ページのタイトルが取得される

=JOIN("",IMPORTXML("https://ja.wikipedia.org/wiki/"&B6&"","//*[@id='mw-content-text']/div[1]/p[1]"))

さらに、このように指定すると、記事の要約も取得出来る。

JOIN関数で囲んでいるのは記事が複数の段落になっている場合があるためである。xpathで段落<p>タグを指定している為、複数ある場合配列となり、複数セルに展開される。

複数セルに展開したほうが良い場合はJOINで囲む必要はないが、文章が一つのセルに収まってほしい場合はこのようにJOIN関数で配列を一つのテキストにする。

こちらの画像ではLinuxを入力した行とUbuntuを入力した行の2行があり、それぞれtitleと要約を取得しているので計4つのimportxml関数を指定したセルが存在している。

実はこのimportxmlを指定したセルの数がとても重要である。

importxml関数は一回一回の取得する動作が重いので、複数セルで指定すると取得がどんどん遅くなり、10箇所くらいならまだ大丈夫なものの20以上となるとかなり動作が怪しく、取得に失敗する。

なので、普通の関数のつもりでまとめて一列1万セルに貼り付けなんてやってしまうと固まる。

つまり、importxml関数はそういう使い方は向かないのである。

前回のWikipedia APIの利用例のように一つのセルにimportxml関数を記述し、複数セルに展開するのが好ましい使い方だと言える。

そのような使い方であれば高速に動作しとても便利に感じるはずである。

htmlの複数セル展開

htmlに対してもAPIでxmlを取得するのと同様に配列を展開できる。

一例としてYahooショッピングでの検索結果を取得する。


=IMPORTXML("https://shopping.yahoo.co.jp/search?first=1&tab_ex=commerce&fr=shp-prop&oq=&aq=&mcr=3e3872a632eb5248bc76b8569a0a9363&ts=1614767575&p="&B6&"&cid=&pf=&pt=&area=13&astk=&sc_i=shp_pc_top_searchBox_2&sretry=1","//li[@class='LoopList__item']")

こちらもB6セルに入れた文字、この例ではLinuxでYahooショッピングを検索した結果が複数セルに展開されている。

xpathの指定はChromeブラウザであれば検証>Copy>Copy Xpathで簡単に取得できる

はまり安い注意点としてはCopyしたXpath内のダブルクォーテーションはシングルクォーテーションに書き換えないとエラーで動作しない事くらい。

xpathの複数指定

例えば、一つのページ内のtitleタグとpタグを取得したいとする。
2つのセルにimportxml関数をそれぞれxpathにtitleとpで指定すれば取得は出来る。
だけども、先に記したようにimportxmlはなるべく少ないほうが良い。
そこで考えたのが一つのimportxml関数でxpathを複数指定できないものかということ。
これはimportxmlの仕様というよりxpathの仕様を調べる必要があった。
そして、複数指定できることがわかった。
指定方法は簡単で | で区切るだけであった。
例えば、自分で作ったページのtitleとh1が合致しているかをチェックしたいならこんな風に
"//title|//h1"
とxpath指定すれば両方を取得して2つのセルに展開される。
2つのセルが同じかを次のセルにif関数で判定するように記述しておけば同じか否かはすぐにわかる。
ここではYahooショッピングの商品詳細ページにおいてtitleタグとh2タグを取得する例を掲載しておく。
titleは一つだが、h2は複数あるので複数セルに展開される。
関数の記述は至ってシンプル
=IMPORTXML("https://store.shopping.yahoo.co.jp/ebookjapan/b00162119294","//title|//h2")

まとめ

2回に渡ってIMPORTXML関数の利用例を記載した。
ま、ほぼ自分の備忘録的な内容ではあるけど、IMPORTXML関数が使いようによっては便利である事と、重いので極力記述するセルの数を抑えたほうが良い事が伝われば幸いである。

今回ブログに使用した例はこちらのスプレッドシートからも確認できる。

コメント

このブログの人気の投稿

Googleスプレッドシートの正規表現置換で改行文字

『ベトナム語』多言語対応学習アプリDropsを一年以上続けてみた