HTML ファイルからタイトルを抜き出す

codeなにがし::phpでhtmlファイルからタイトルを抜き出すからですが、HTML からタイトルを抜き出します。 HTML はかなりいい加減に記述しても認識してくれるため、ここでは簡単なものしか想定していません。

想定するものは、以下のような例です。

<html>
<head>
<title>タイトル</title>
</head>
<body>
中身です。
</body>
</html>

つまりタイトルのタグが 1 行にある場合です。

<html>
    <head>
        <title>
            タイトル
        </title>
    </head>
    <body>
        中身です。
    </body>
</html>

タイトルのタグが異なる行にまたがっている場合です。

本来 HTML や XML のような行単位でないファイルを awk で扱うのは難しいのですが、以下のようなスクリプトを用意してみました。

#! /usr/bin/gawk -f
# pick_title.awk

BEGIN {
    RS = "\034";
}

{
    sub(/.*<[tT][iI][tT][lL][eE]>/, "", $0);
    sub(/<\/[tT][iI][tT][lL][eE]>.*/, "", $0);
    gsub(/[\r\n]/, "", $0);
    sub(/^[ \t]+/, "", $0);
    sub(/[ \t]+$/, "", $0);
    print $0;
}

少々強引ではありますが、RS を "\034" に設定してあります。 "\034" は HTML 内に存在しないことを想定しています。

実際に実行してみると、どちらも「タイトル」と抜き出せます。

$ nawk -f pick_title.awk test.html
タイトル

例えば、AWK Users JP :: 日本の AWK ユーザのためのハブサイトのタイトルを抜き出すには以下のようにします。

$ wget -o /dev/null -O - http://gauc.no-ip.org/awk-users-jp/ 1>\%PAGE_BODY%amp;amp;1 | nawk -f pick_title.awk
AWK Users JP :: 日本の AWK ユーザのためのハブサイト

本来行単位で扱うことが awk の本来の処理ですので、あまり HTML のようなものを処理するには向いていませんが、特定の用途に対しては便利な場合もあります。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png