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> タグは、以下のようなオプションをつけた使い方ができます。
<a href="URL">
: URL へのリンク
<a name="名前">
: ページ内リンクのリンク先として名前をつける
<a href="URL" target="名前">
: URL のリンク先を、
指定した名前のフレーム上で表示する
target
は、最近はあまり推奨されない機能なのですが、
これを利用するとブラウザのウィンドウを 2 つ開いて、
一方のウィンドウではリンク元の WWW ページを開いたまま
もう一方のウィンドウ上でリンク先の WWW ページを参照できます。
これは、今回のように沢山のリンクのリストと
そのリスト先のページを参照する場合に便利な機能で、
リンクの一覧とリンク先をひとつのウィンドウ内で行ったりきたりせずに、
多くのリンクの一覧を次々と参照していくことができます。
今回は、この target
オプションを追加することで
その機能を利用することにします。
target
オプションの追加は、<a href="URL">
の
a
と href
の間か、"URL"
と >
の間の
どちらかに入れればいいのですが、今回は後者の方に入れてみることにします。
これは、その "URL"
と >
の部分を match() を利用して見きわめて、
substr() を利用してそれより前の部分の文字列と
後の部分の文字列に分けることでできます。
以下のような正規表現で match() を使うと、
a
タグ全体の位置を調べることができます。
match(str,/<a href=\"[^\"]+\">/)この正規表現は、
を意味しています。 このとき、RSTART+RLENGTH がこのタグの次の文字の位置を意味しますので、[^\"]
="
以外の文字 1 文字
[^\"]+
="
以外の文字 1 文字以上
\"[^\"]+\"
="
と"
でくくられた ("
が含まれない) 文字列
<a href=\"[^\"]+\">
= 「<a href="文字列">
」という文字列
substr(str,1,RSTART+RLENGTH-2) =ということになります。 よってこれを利用すれば、str に <li> の行が入っているとして、a
タグの'>'
の前までの文字列
substr(str,RSTART+RLENGTH-1) =a
タグの'>'
以降の文字列
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> 毎に区切りを入れるには、 回の <li> タグの出力が終わった後で
if(j%5==0) printf "<br><br>\n";のようなものでも入れればいいでしょう。 「
j%5==0
」は
が 5,10,15,...と 5 の倍数のときにだけ真となりますから、
これで 5 つ毎に区切りが入ることになります。
さらに、
if(j%5==0) printf "<br>(ここまで %d 件)<br><br>\n",j;のようにしてもいいかもしれません。