最近の更新 (Recent Changes)

2014-01-01
2013-01-04
2012-12-22
2012-12-15
2012-12-09

Wikiガイド(Guide)

サイドバー (Side Bar)


← 前のページに戻る

6. HTTPクライアント機能で取得したHTMLファイルを加工するコツ

みなさんは、毎日WWW上の情報をブラウザで見ていることと思います。 いつも訪れるサイトには、頻繁に更新される有用な情報があるでしょう。

ここでは、デカルト言語のHTTPクライアント機能を使って、そのようなサイトの好きなWWWのHTMLファイルを取得し そこから、必要な情報を抜き出して加工するコツについて説明しましょう。

6.1. HTMLファイルの取得

対象サイトのHTMLの取得には次に示すような手順にすると良いでしょう。


::sys <PrintResultOff>
::sys <httpget #ヘッダ変数 #ボディ変数 "http://対象サイトのアドレス" >
::sys <htmldecode #ボディ変数1 #ボディ変数>
::sys <iconv #ボディ変数2 #ボディ変数1> 

1) 最初のPrintResultOff述語を実行することにより、プログラムの実行結果を出力するのを抑止しておきます。

2) httpget述語で、対象サイトのHTMLファイルを#ボディ変数に読み込みます。 #ヘッダ変数には、接続状況が入ります。

これは、httpプロトコルのGETメソッドの動作そのままです。

3) 次のhtmldecode述語では、&ampや&gtのようなHTMLの特殊記号を元の&や<のような文字に戻します。

4) 次のiconv述語は、元のHTMLファイルがSJISやUTF-8のようなさまざまなコードであっても、 システムの使用している文字コードに変換してくれます。

特定の文字コードに決め打ちで変換したい場合には、引数を拡張して指定します。 そのような場合については、sysモジュールのマニュアルを参照してみてください。

これらの処理により、引数に指定された変数に順に加工する元になるHTMLが文字列として設定されていきます。


#ボディ変数 → #ボディ変数1 → #ボディ変数2

#ボディ変数2には、特殊文字が複合化され、文字コードも変換されたHTMLファイルの内容が文字列として設定されています。

これを元に次から示すようにターゲットの情報を取得していきましょう。

6.2. スクリプトの削除

HTMLファイルの中には、javascriptのようなスクリプトが含まれることが多くあります。

HTMLとは異なり、このようなスクリプトは多様なプログラムを実行するためにさまざまな表現が含まれるため、HTMLを加工する際には邪魔になります。

そこで最初にスクリプトをHTMLの文字列から削除しましょう。 HTMLの文字列は、前の項で示した#ボディ変数2に入っているとします。


::sys <erasetags #ボディ変数3 #ボディ変数2 "script" "/script">

erasetags述語に"script","/script"を引数と指定して実行することにより、#ボディ変数2に含まれる<script ~ </script>までをすべて削除した文字列を#ボディ3変数に設定します。

6.3. 目的の情報の周囲の確認

まず対象サイトのHTMLをファイル経由で取得し、その中の目的とする情報の周囲を確認します。

目的とする情報の周囲の記述を確認して、特徴的なタグや文字列を探します。

実際にやってみましょう。

前項までの記述をまとめて以下のようなプログラムの記述を作成します。

なお、全体の見通しをすっきりさせるため、ヘッダ変数となっていた変数は#h、ボディ変数となっていた変数は#bとしています。


? ::sys <PrintResultOff>
  ::sys <httpget #h #b "http://対象サイトのアドレス" >
  ::sys <htmldecode #b1 #b>
  ::sys <iconv #b2 #b1>

  ::sys <erasetags #b3 #b2 "script" "/script">

  <print #b3>
  ;

"対象サイトのアドレス"は、ターゲットとする対象サイトのアドレスと置き換えてください。

例としてSOURCEFORGE.JPのサイトの情報を対象を例として説明しましょう。

"http://sourceforge.jp/"の中の"新着Magazine記事"を目的の情報とします。


? ::sys <PrintResultOff>
  ::sys <httpget #h #b "http://sourceforge.jp/" >
  ::sys <htmldecode #b1 #b>
  ::sys <iconv #b2 #b1>

  ::sys <erasetags #b3 #b2 "script" "/script">

  <print #b3>
  ;

これをh.decという名前で保存して、デカルト言語で実行します。

結果は、hout.htmlというファイルにリダイレクトするとします。


$ descartes h.dec >hout.html

さて、出力されたhout.htmlの中をエディタで見てみましょう。

"新着magazine記事"で検索すると次に示すような部分が見つかります。


<div id="home_content">
<div class="content-block"><div id="magazine-index"><h3 class="titlebar"><a href="http://sourceforge.jp/magazine/rss"><span class="spimg-rss spclass-float-right-nontxet"></span></a><a href="http://sourceforge.jp/magazine/"><span class="spimg-news spclass-float-left-nontext"></span>新着magazine記事</a></h3><div class="block-contents"><div class="article-entry"><span class="spimg-document spclass-float-left-nontext"></span><h4><a href="http://sourceforge.jp/magazine/11/10/11/0718256">米googleがwebアプリ向け言語「dart」を発表、

この中で""の直近で特徴的なタグを探してみます。

じっと見ていると、<div id="magazine-index">が見つかります。

念のために同じタグがHTMLファイル内にないことをエディタの検索機能を使って確認しておきましょう。

次に、この記事の最後の部分をスクロールして探してみます。


linux foundationに加入</a> <span class="article-entry-date">(10/7 12:32)</span></h4><p> linuxを推進するlinux foundationは10月5日、新たに米eucalyptus systems、米nebula、米virtual bridgesの3社が参加したことを発表した。クラウドや仮想化技術などエンタープライズ面で協力することになる。</p></div><div class="more"><a href="http://sourceforge.jp/magazine/">もっと見る</a>>></div></div></div></div><!-- 1st left float --><div class="sitetop-multicol"><div class="content-block"><div><h3 class="titlebar"><a href="http://b.sourceforge.jp/%e6%9c%80%e6%96%b0%e6%8a%95%e7%a8%bf/">ブログ新着投稿</a></h3><div class="block-contents"><div class="article-entry"><h4><a href="http://seussnu.b.sourceforge.jp/2011/10/10/roguelike-thief-ver-0-0-5-%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9%e3%83%8e%e3%83%bc%e3%83%88/">roguelike thief ver 

元のサイトをブラウザでみてみると"ブログ新着投稿"の前の"もっと見る"が記事の最後の部分です。

"もっと見る"の直後で特徴的なタグを探します。

<!-- 1st left float -->が該当しそうです。

これで、<div id="magazine-index">から、<!-- 1st left float -->までの範囲の中に目的とする、"新着magazine記事"が含まれていることが判りました。

6.4. 目的の情報の切り出し

前の項で確認した目標とする情報の範囲を抜き出します。

このときの情報の範囲は対象とする情報が含まれていれば、その他に多少余分なタグや情報が含まれていても構いません。 不要な情報は後ほどにリストや文字列として削除してしまえばよいのです。

情報の抜き出しには、htmltags述語を使います。

前の項では、<div id="magazine-index">から、<!-- 1st left float -->までの範囲の中に目的とする、"新着magazine記事"が含まれていることが判りました。

その情報を抜き出すには次のようなhtmltags述語を使います。


  ::sys <httptags 抜き出し後の文字列 インプット文字列 'div id="magazine-index"' '!-- 1st left float --'>

第3引数と第4引数に範囲を示すタグを指定します。 これら、タグには<>は付けません。また、タグ文字列は'(シングルクォート)で括ります。

前の項で作成したh.decにhttptags述語を加えて次のようなh2.decファイルを作成しましょう。


? ::sys <PrintResultOff>
  ::sys <httpget #h #b "http://sourceforge.jp/" >
  ::sys <htmldecode #b1 #b>
  ::sys <iconv #b2 #b1>

  ::sys <erasetags #b3 #b2 "script" "/script">

  ::sys <htmltags #b4 #b3 'div id="magazine-index"' '!-- 1st left float --'>

  <print #b4>
  ;

これをデカルト言語で実行します。

結果は、hout2.htmlというファイルにリダイレクトするとします。


$ descartes h2.dec >hout2.html

さて、出力されたhout2.htmlの中をエディタで見てみると目的としていた情報がhtmlの形式で入っているのを確認してください。


(<div id="magazine-index"><h3 class="titlebar"><a href="http://sourceforge.jp/ma
gazine/rss"><span class="spimg-rss spclass-float-right-nontxet"></span></a><a hr
ef="http://sourceforge.jp/magazine/"><span class="spimg-news spclass-float-left-
nontext"></span>新着magazine記事</a></h3><div class="block-contents"><div class=
"article-entry"><span class="spimg-document spclass-float-left-nontext"></span><
h4><a href="http://sourceforge.jp/magazine/11/10/07/0827201">「ios 5」対応を進め
た「monodevelop 2.8」がリリース</a> <span class="article-entry-date">(10/7 17:25
)</span></h4><p> 米xamarinは10月5日、オープンソースの.net統合開発環境(ide)の最
新版「monodevelop 2.8」を公開した。先に米appleが発表した「ios 5」への対応が中心
となる。</p></div><div class="article-entry"><span class="spimg-document spclass
-float-left-nontext"></span><h4><a href="http://sourceforge.jp/magazine/11/10/07
/0740248">apache http serverのmod_proxyに脆弱性</a> <span class="article-entry-d
ate">(10/7 16:38)</span></h4><p> 2011年10月6日、apache http serverのmod_proxyに
脆弱性が発見された。リバースプロクシとしてapacheを利用している場合に影響を受ける
という。脆弱性が存在するのはhttpd 1.3系の全バージョンと、2.x系の全バージョン。</
p></div><div class="article-entry"><span class="spimg-document spclass-float-lef
t-nontext"></span><h4><a href="http://sourceforge.jp/magazine/11/10/07/0334240">
eucalyptusらクラウド/仮想化関連企業3社がlinux foundationに加入</a> <span class="
article-entry-date">(10/7 12:32)</span></h4><p> linuxを推進するlinux foundation
は10月5日、新たに米eucalyptus systems、米nebula、米virtual bridgesの3社が参加し
たことを発表した。クラウドや仮想化技術などエンタープライズ面で協力することになる
。</p></div><div class="article-entry"><span class="spimg-document spclass-float
-left-nontext"></span><h4><a href="http://sourceforge.jp/magazine/11/10/06/05222
31">mozilla、クラッシュを引き起こすとしてfirefoxユーザーにmcafeeアドオンの無効化
を呼びかけ</a> <span class="article-entry-date">(10/6 14:21)</span></h4><p> mozi
llaは10月3日、mcafee(米intel傘下)が提供するブラウザアドオン「mcafee scriptscan
」を互換性の問題からブロック対象とした。ユーザーに対しては、同アドオンの無効化を
呼びかけている。</p></div><div class="article-entry"><span class="spimg-document
 spclass-float-left-nontext"></span><h4><a href="http://sourceforge.jp/magazine/
11/10/06/0428245">openstackプロジェクト、独立した非営利団体「openstack foundatio
n」の設立を発表</a> <span class="article-entry-date">(10/6 13:24)</span></h4><p>
 米rackspaceが支援するオープンソースのクラウドosプロジェクトopenstackは10月5日、
非営利団体「openstack foundation」を設立する計画を発表した。プロジェクトの独立性
を尊重してのもので、ガバナンス体系を持ち、商標や著作権の保有などにも責任を持つ。
</p></div><div class="more"><a href="http://sourceforge.jp/magazine/">もっと見る
</a>>></div></div></div></div><!-- 1st left float -->)

なんか、まだグシャとしてわかり難いですね。

上の結果をじっと見てみると、<p>から</p>に囲まれて記事が書いてあるのがわかります。

もう一度htmltags述語を使って<p>から</p>に囲まれた部分を抜き出します。

htmltags述語は、指定された範囲が複数ある場合にはリスト形式にして結果を返します。

h2.decに次のようにhtmltags述語を追加して、h3.decを作ります。


? ::sys <PrintResultOff>
  ::sys <httpget #h #b "http://sourceforge.jp/" >
  ::sys <htmldecode #b1 #b>
  ::sys <iconv #b2 #b1>

  ::sys <erasetags #b3 #b2 "script" "/script">

  ::sys <htmltags #b4 #b3 'div id="magazine-index"' '!-- 1st left float --'>

  ::sys <htmltags #b5 #b4 "p" "/p">

  <printlistnl #b5>
  ;

実行して結果を見てみましょう。


$ descartes h3.dec
 <p> 米xamarinは10月5日、オープンソースの.net統合開発環境(ide)の最新版「monode
velop 2.8」を公開した。先に米appleが発表した「ios 5」への対応が中心となる。</p>
<p> 2011年10月6日、apache http serverのmod_proxyに脆弱性が発見された。リバースプ
ロクシとしてapacheを利用している場合に影響を受けるという。脆弱性が存在するのはht
tpd 1.3系の全バージョンと、2.x系の全バージョン。</p> <p> linuxを推進するlinux fo
undationは10月5日、新たに米eucalyptus systems、米nebula、米virtual bridgesの3社
が参加したことを発表した。クラウドや仮想化技術などエンタープライズ面で協力するこ
とになる。</p> <p> mozillaは10月3日、mcafee(米intel傘下)が提供するブラウザアド
オン「mcafee scriptscan」を互換性の問題からブロック対象とした。ユーザーに対して
は、同アドオンの無効化を呼びかけている。</p> <p> 米rackspaceが支援するオープンソ
ースのクラウドosプロジェクトopenstackは10月5日、非営利団体「openstack foundation
」を設立する計画を発表した。プロジェクトの独立性を尊重してのもので、ガバナンス体
系を持ち、商標や著作権の保有などにも責任を持つ。</p>

6.5. 不要タグの削除

前の項目の説明までで、ターゲットとしている情報を抜き出しました。

そこで次は、不要なタグを削除してみましょう。

とりあえず、htmlのタグをすべて削除するために、erasealltags述語を使います。 この述語は、<>で囲まれたタグをすべて削除してくれます。

前の項で作ったh3.decにerasetags述語を追加して、h4.decを作ってください。


? ::sys <PrintResultOff>
  ::sys <httpget #h #b "http://sourceforge.jp/" >
  ::sys <htmldecode #b1 #b>
  ::sys <iconv #b2 #b1>

  ::sys <erasetags #b3 #b2 "script" "/script">

  ::sys <htmltags #b4 #b3 'div id="magazine-index"' '!-- 1st left float --'>

  ::sys <erasealltags #b5 #b4>

  <print #b5>
  ;

実行結果は以下のようになります。


$ descartes h4.dec
  米xamarinは10月5日、オープンソースの.net統合開発環境(ide)の最新版「monodevel
op 2.8」を公開した。先に米appleが発表した「ios 5」への対応が中心となる。  2011年
10月6日、apache http serverのmod_proxyに脆弱性が発見された。リバースプロクシとし
てapacheを利用している場合に影響を受けるという。脆弱性が存在するのはhttpd 1.3系
の全バージョンと、2.x系の全バージョン。  linuxを推進するlinux foundationは10月5
日、新たに米eucalyptus systems、米nebula、米virtual bridgesの3社が参加したことを
発表した。クラウドや仮想化技術などエンタープライズ面で協力することになる。  mozi
llaは10月3日、mcafee(米intel傘下)が提供するブラウザアドオン「mcafee scriptscan
」を互換性の問題からブロック対象とした。ユーザーに対しては、同アドオンの無効化を
呼びかけている。  米rackspaceが支援するオープンソースのクラウドosプロジェクトope
nstackは10月5日、非営利団体「openstack foundation」を設立する計画を発表した。プ
ロジェクトの独立性を尊重してのもので、ガバナンス体系を持ち、商標や著作権の保有な
どにも責任を持つ。

結果はリスト形式になっているので、それぞれの項目ごとに改行して表示するようにしましょう。

結果が複雑なリスト形式になっている可能性があるので、flatten述語で平坦なリスト構造に変換した後に、printlistnl述語でリストのアトム単位で改行しながら表示するようにします。

次のh5.decを見てください。h4.decのprint述語をflatten述語とprintlistnl述語に置き換えています。


? ::sys <PrintResultOff>
  ::sys <httpget #h #b "http://sourceforge.jp/" >
  ::sys <htmldecode #b1 #b>
  ::sys <iconv #b2 #b1>

  ::sys <erasetags #b3 #b2 "script" "/script">

  ::sys <htmltags #b4 #b3 'div id="magazine-index"' '!-- 1st left float --'>

  ::sys <htmltags #b5 #b4 "p" "/p">

  ::sys <erasealltags #b6 #b5>

  ::sys <flatten #b7 #b6>

  <printlistnl #b7>
;

実行結果を見てみましょう。


$ descartes h5.dec
 米xamarinは10月5日、オープンソースの.net統合開発環境(ide)の最新版「monodevelo
p 2.8」を公開した。先に米appleが発表した「ios 5」への対応が中心となる。
 2011年10月6日、apache http serverのmod_proxyに脆弱性が発見された。リバースプロ
クシとしてapacheを利用している場合に影響を受けるという。脆弱性が存在するのはhttp
d 1.3系の全バージョンと、2.x系の全バージョン。
 linuxを推進するlinux foundationは10月5日、新たに米eucalyptus systems、米nebula
、米virtual bridgesの3社が参加したことを発表した。クラウドや仮想化技術などエンタ
ープライズ面で協力することになる。
 mozillaは10月3日、mcafee(米intel傘下)が提供するブラウザアドオン「mcafee scrip
tscan」を互換性の問題からブロック対象とした。ユーザーに対しては、同アドオンの無
効化を呼びかけている。
 米rackspaceが支援するオープンソースのクラウドosプロジェクトopenstackは10月5日、
非営利団体「openstack foundation」を設立する計画を発表した。プロジェクトの独立性
を尊重してのもので、ガバナンス体系を持ち、商標や著作権の保有などにも責任を持つ。

目的としていた記事のリストが取得できました。

このように、目的とする情報を抜き出すには、4. HTTPタグ加工機能で説明した機能やデカルト言語の機能を使って、徐々に試行錯誤していきます。wwwサイトごとにhtmlは異なるのでそれぞれのサイトごとに情報の取得方法を試行錯誤していく必要があります。 しかし、一度取得するためのデカルト言語のプログラムを確立すれば、そのサイトからはいつでも対象の情報を取得することができるようになるのです。

6.6. 目的情報の加工


--

--