最近の更新 (Recent Changes)

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

Wikiガイド(Guide)

サイドバー (Side Bar)


← 前のページに戻る

4. HTTPタグ加工機能

HTTPクライアント機能を使うと対象サイトのhtmlが得られます。

しかし、生のhtmlのままでは、結構膨大で複雑な構造をしていることが多いです。

それを加工して、役立つ情報を取り出すのはそのままではとても大変で途方にくれてしまいますね。

本来は、libxml2を使ってDOM, SAXを使うべきかとも考えましたが、それも面倒です。

htmlをすべて構文解析するならば、デカルト言語には強力な構文解析機能があるのでそれが使えるでしょう。

そこで、厳密なhtmlの解釈をしなくても対象wwwサイトのhtmlの構成がわかっていればざっくりと必要な情報を掘り出せるような手段を考えてみました。

例題として示している、「2011年夏版 全国電力供給状況表示プログラム」、「ニュースヘッドライン表示プログラム」、「経済指標表示プログラム」はこの機能を使って作られています。対象wwwサイトの目指す情報を抜き出してきてから、加工して表示するものばかりです。 複数のwwwサイトにアクセスして、情報を収集・集約して表示しているものもあります。

加工結果をhtml形式で出力するのも簡単なので、複数wwwサイトの情報を集約して新しい情報を出力するwwwサイトの作成も可能です。

4.1 タグの収集

指定したタグに該当する部分をhtml文字列から抜き出してリストにして、第一引数の変数に設定します。

該当するタグの部分が複数ある場合にはすべて検索されてリストに登録されます。


::sys <htmltags 変数 文字列リスト TAG [TAG2]>

	文字列の中からTAGを抜き出したリストを変数に設定する。
	TAG2が指定されている場合は、TAGとTAG2に囲まれた範囲
	を抜き出したリストを変数に設定する。

引数の文字列リストは、単なる文字列でも文字列をリストで接続したものでも良いです。 そのとき、リストの構造はフラットでなく複雑な構造をしていても大丈夫です。

この機能を使うと、httpクライアント機能を使って抜き出してきた情報の中から好きな情報を的確に抜き出すことができます。

例えば以下のようなhtmlがあったとします。


…

           </div>

        <div class="cmn-sub_market">
                <h2 class="cmnc-title">主な市場指標</h2>
                <div class="cmnc-profile</div>
                <table cellspacing="0" summary="市場指標一覧">
                        <tbody>
                        <tr class="cmnc-odd">
                                                <th>
…


                                </tbody>
                </table>
        </div>

        <div class="cmn-sub_square_banner">
        <div id="ADVERTISE_RECTANGLE1">
                <div>

…

このとき、<div class="cmn-sub_market"> ~ <div class="cmn-sub_square_banner">の範囲を抜き出すには以下のようにします。


        ::sys <htmltags #結果リスト変数 HTML文字列 
                'div class="cmn-sub_market"' 
              'div class="cmn-sub_square_banner"'>

タグは<>を付けないで中身を指定します。

また、タグの中身は完全な形でなくても、例えば、'div class='と途中まで指定した場合も有効です。 指定した文字列に部分的に合致する文字列も結果リストに登録されます。

指定する引数のタグが一つだけの場合には、指定されたタグが抜き出されてリストに登録されます。

例えば、次に示すような指定をすると、htmlファイルに含まれているすべてのリンク先が採取できます。


        ::sys <htmltags #結果リスト変数 HTML文字列 'a href='>

指定するタグは途中まででも有効なため、上の処理では、<a href=http:// ~ > のようなリンクがすべて採取されます。

なお、第2引数は文字列となっていますが、文字列のリストも指定することが可能です。

つまり、htmltags述語で得られた結果をそのまま入力にすることができます。結果リストに対してもう一度別のタグを指定することによって範囲を絞って必要な部分を抜き出すことも可能ということです。

4.2 タグの削除

この機能を使うと、httpクライアント機能を使って指定したタグや、指定したタグの範囲の情報を削除することができます。

前のhtmltags述語とは、逆の働きをします。

該当するタグの部分が複数ある場合にはすべて削除されます。


::sys <erasetags 変数 文字列リスト TAG [TAG2]>

	文字列から指定されたTAGを消して変数に設定する。
	TAG2が指定されている場合は、TAGからTAG2の範囲を
	消して変数に設定する。

指定方法は、htmltags述語と同じです。

タグは<>を付けないで中身を指定します。

また、タグの中身は完全な形でなくても、例えば、'div class='と途中まで指定した場合も有効です。

指定する引数のタグが一つだけの場合には、指定されたタグに合致するタグがすべて削除されます。

4.3 コメントの削除

この機能を使うと、httpクライアント機能を使ってhtmlテキスト内のコメントを削除することができます。

コメント部分が複数ある場合にはすべて削除されます。


::sys <eraseCommenttags 変数 文字列リスト>

        文字列から指定されたコメントを消して変数に設定する。

指定方法は、htmltags述語と同じです。

タグは<>を付けないで中身を指定します。

また、タグの中身は完全な形でなくても、例えば、'div class='と途中まで指定した場合も有効です。

指定する引数のタグが一つだけの場合には、指定されたタグに合致するタグがすべて削除されます。

4.4 タグによるhtmlの分割

この機能を使うと、httpクライアント機能を使って指定したタグで分割された文字列リストを返します。

該当するタグの部分が複数ある場合には、複数の要素を持つリストに分割されます。


::sys <splittags 変数 文字列リスト タグ>

        指定したタグごとに文字列リストを分割したリストを変数に
        設定する。タグは分割したリストの要素の文字列の最後に
        付く。

結果リストの中で、指定したタグを含むまでが一つのリストの要素の文字列となります。

例えば ::sys <splittags #s "~略~" "/a">を実行すると以下のようになります。


 "<a href="#main-articles">Stories</a><br> <a href="#blocks">Slash Boxes</a><br> <a href="#comments">Comments</a><br>"

 ↓

 ("<a href="#main-articles">Stories</a>"  "<br> <a href="#blocks">Slash Boxes</a>"  "<br> <a href="#comments">Comments</a>" "<br>")


"/a"を指定することによって、</a>タグごとに文字列が分離されます。

4.5 すべてのタグの削除

この機能を使うとすべての<>で囲まれたタグを削除します。

必要な情報の範囲を絞り込んだ後に、文字列情報だけを残すのに使うと便利です。


::sys <erasealltags 変数 文字列リスト>

	文字列からすべてのタグを消して、変数に設定する。

あまり広い範囲のhtmlの文字列を指定すると、javascriptのコードなどを誤解釈してしまうことがあるので、できるだけ対象を絞り込んだ後にこの述語を使うのがコツです。

4.6 文字列の操作

htmlであっても、タグとしてではなく文字列として操作すると便利なことが多いです。

そのような場合にはつぎに示すような機能が便利です。

これらの処理は、文字列だけではなく、ここまでに示したタグの操作の結果生成された文字列のリストに対しても操作できるように仕様を工夫しています。


::sys <erasestr 変数 文字列リスト STR1 [STR2]>

	文字列の中から文字列STR1を消して、変数に設定する。
	STR2が指定されている場合は、文字列の中で文字列STR1
	と文字列STR2に囲まれた文字列を消して変数に設定する。

::sys <htmldecode 変数 文字列リスト>

	html文書の中で使えない文字を&quot, &amp, &lt, &gt, &nbsp	
	から変換する。

::sys <htmlencode 変数 文字列リスト>

	html文書の中で使えない文字を&quot, &amp, &lt, &gt, &nbsp
	と変換する。

::sys <regex 正規表現パターン 文字列リスト 前文字列 マッチ文字列 後文字列>

	文字列リストに正規表現パターンを適用した結果をマッチ文字列
	に設定し、前後の文字列を前文字列と後文字列に設定します。

::sys <replacestr 変数 文字列リスト 文字列1 文字列2>

	文字列の中の、文字列1をすべて文字列2に置き換えて変数に
	設定する。

::sys <LF2CRLF 変数 文字列リスト>

	改行コードLF(0x0a)をCRLF(0x0d 0x0a)に変換する。

::sys <CRLF2LF 変数 文字列リスト>

	改行コードCRLF(0x0d 0x0a)をLF(0x0a)に変換する。


::sys <gsub 正規表現パターン 文字列リスト 置換文字列 出力文字列>

	文字列リストに正規表現パターンを適用して該当した部分を、
	置換文字列に置換えた結果を出力文字列に設定します。
	置換えは文字列のすべての該当部分に行われます。

::sys <sub 正規表現パターン 文字列リスト 置換文字列 出力文字列>

	文字列リストに正規表現パターンを適用して該当した部分を、
	置換文字列に置換えた結果を出力文字列に設定します。
	置換えは最初の1回だけ行われます。
	(Windows上では動作しません。)

::sys <regex 正規表現パターン 文字列 前文字列 マッチ文字列 後文字列>

	文字列に正規表現パターンを適用した結果をマッチ文字列
	に設定し、前後の文字列を前文字列と後文字列に設定します。
	(Windows上では動作しません。)

::sys <split 変数 文字列 [区切り文字]>

	文字列を区切り文字で分けてリストにしたものを
	変数に設定します。区切り文字が指定されていない
	場合は、空白とタブで区切られます。

::sys <splitline 変数 文字列 [区切り文字]>

	文字列を行で分けてリストにしたものを変数に設定します。


操作した結果のリストは、flatten述語でフラットなリストに変換したり、concat述語でリストを文字列に変換することによって最終的な形式にすることができます。


::sys <flatten 変数 リスト>

        リストを平坦化して変数に設定する。

::sys <concat 変数 リスト>

        文字のリストを合体させ文字列を合成して変数に設定します。


4.7 URLエンコード・デコード

URLに指定する文字には、"-", ".", "_"以外の記号や日本語の文字などアルファベット以外の文字は使えません。

そこで、urlencode述語で事前にURLに指定できる文字に変換しておきます。

ウィキペディアなどを使っていると%がいっぱい使われているアドレスを見かけます。それがURLエンコードされた結果です。


http://ja.wikipedia.org/wiki/URLエンコード

  ↓URLエンコード

http://ja.wikipedia.org/wiki/URL%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89

URLデコードは、逆にURLエンコードされた文字列を元に戻すときに使います。


http://ja.wikipedia.org/wiki/URL%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89

  ↓URLデコード

http://ja.wikipedia.org/wiki/URLエンコード

httpgetなどのhttpクライアントでURLの指定に日本語などの文字列を指定しなければならないときには、必ずurlencodeでURLエンコードしなければなりません。

また、htmlの中から取り出したURLの引数を元の文字列に戻すにはurldecoceで変換すればよいのです。


::sys <urldecode 変数 文字列リスト>

	文字列をURLエンコードされた形式から復号化する。
	復号化された結果は変数に設定される。

::sys <urlencode 変数 文字列リスト>

	文字列をHTTPクライアントで送信するときの形式(URLエンコード)
	に符号化する。
	符号化された結果は変数に設定される。


4.8 HTMLエンコード・デコード

HTMLの中では、以下の特殊文字が使えません。


 特殊記号
   ' クォート
   &  アンパサンド
   <  小なり記号
   >  大なり記号
      空白

htmlencode述語は、これらの文字をHTML文書内で使えるように変換します。


 特殊記号の変換
   ' クォート    ←→ &quot
   &  アンパサンド  ←→ &amp
   <  小なり記号  ←→ &lt
   >  大なり記号  ←→ &gt
      空白     ←→ &nbsp

htmldecode述語は、元の特殊文字に変換します。

httpクライアント機能により、WWWのhtmlを取得したときにはそれにhtmldecode述語を実行しておくと良いでしょう。

なお、上記で空白とあるのは、HTMLでは複数の空白があっても自動的に詰められて表示されてしまうのを防ぐためのものです。 &nbspは厳密に1つの空白に変換されます。


::sys <htmldecode 変数 文字列リスト>

	html文書の中で使えない文字を&quot, &amp, &lt, &gt, &nbsp	
	から変換する。

::sys <htmlencode 変数 文字列リスト>

	html文書の中で使えない文字を&quot, &amp, &lt, &gt, &nbsp
	と変換する。


--

--