次へ: 8 全体のソースコード 上へ: AWK による HTML ファイルの整形 その 2 前へ: 6 行の分割 (PDF ファイル: awkwww2.pdf)

7 行の整形出力

ここでは、5 節で説明した (2) の整形して出力する部分を考えます。

Yahoo! の一覧の各 <li> は、例えば以下のようになっています。

  <li><a href="http://headlines.yahoo.co.jp/...">見出し文字列</a>
    <small> (XXX 新聞) - 15 日(火)15時35分</small>
(実際には 1 行)

このリンクは相対的なリンクではなくて絶対的なリンク (http:// からスタートしている) ですから、 これを手元の HTML ファイルとしてブラウザで参照しても、 そのリンクをたどって向こうにあるリンク先の記事のファイルに アクセスできますので、 この URL の部分は変更する必要はありません。

なお、もしこの URL が、相対的なリンクで以下のように書かれている場合:

  <li><a href="data/20060815/00003.html">見出し文字列</a>
    <small> (XXX 新聞) - 15 日(火)15時35分</small>
この URL を修正しないと手元に HTML ファイルを保存しても このリンクをたどって向こうの記事にはアクセスできませんから、 http://... の部分をこちらで補う必要があります。

ここでは「整形」として、以下のことを行うこととします。

<a> タグは、以下のようなオプションをつけた使い方ができます。

この最後の target は、最近はあまり推奨されない機能なのですが、 これを利用するとブラウザのウィンドウを 2 つ開いて、 一方のウィンドウではリンク元の WWW ページを開いたまま もう一方のウィンドウ上でリンク先の WWW ページを参照できます。 これは、今回のように沢山のリンクのリストと そのリスト先のページを参照する場合に便利な機能で、 リンクの一覧とリンク先をひとつのウィンドウ内で行ったりきたりせずに、 多くのリンクの一覧を次々と参照していくことができます。 今回は、この target オプションを追加することで その機能を利用することにします。

target オプションの追加は、<a href="URL">ahref の間か、"URL"> の間の どちらかに入れればいいのですが、今回は後者の方に入れてみることにします。 これは、その "URL"> の部分を match() を利用して見きわめて、 substr() を利用してそれより前の部分の文字列と 後の部分の文字列に分けることでできます。

以下のような正規表現で match() を使うと、 a タグ全体の位置を調べることができます。

  match(str,/<a href=\"[^\"]+\">/)
この正規表現は、
[^\"] = " 以外の文字 1 文字
[^\"]+ = " 以外の文字 1 文字以上
\"[^\"]+\" = "" でくくられた (" が含まれない) 文字列
<a href=\"[^\"]+\"> = 「<a href="文字列">」という文字列
を意味しています。 このとき、RSTART+RLENGTH がこのタグの次の文字の位置を意味しますので、
substr(str,1,RSTART+RLENGTH-2) = a タグの '>' の前までの文字列
substr(str,RSTART+RLENGTH-1) = a タグの '>' 以降の文字列
ということになります。 よってこれを利用すれば、str に <li> の行が入っているとして、
  if(match(str,/<a href=\"[^\"]+\">/)==0) print str
  else{
      printf "%s",substr(str,1,RSTART+RLENGTH-2)
      printf " target=\"targetframe\""
      printf "%s\n",substr(str,RSTART+RLENGTH-1)
  }
のようにすれば a タグに target オプションを 入れることができるようになります。

いくつかの <li> 毎に区切りを入れるには、 $j$ 回の <li> タグの出力が終わった後で

  if(j%5==0) printf "<br><br>\n";
のようなものでも入れればいいでしょう。 「j%5==0」は $j$ が 5,10,15,...と 5 の倍数のときにだけ真となりますから、 これで 5 つ毎に区切りが入ることになります。 さらに、
  if(j%5==0) printf "<br>(ここまで %d 件)<br><br>\n",j;
のようにしてもいいかもしれません。


次へ: 8 全体のソースコード 上へ: AWK による HTML ファイルの整形 その 2 前へ: 6 行の分割
竹野茂治@新潟工科大学
2006年9月5日