ページの日付

 昔、旧ホームページを運用していた頃は、google の検索結果に日付が出ていた記憶があります。ところがこのサイトの検索結果には日付が出ていませんでした。(ブログ記事は除きます。)

 自分は、検索するときに、検索結果の日付を参考にします。作成したページの殆どに日付を入れています。しかし、google の検索結果に出ていません。

 調べてみると、time 要素が必要だということを知りました。HTML5 から使える要素なので、旧ホームページを立ち上げた後で変わったようです。

 各ページの日付の形式を time 要素の書式に合うように修正し、time タグで囲むように修正しました。手作業で修正するのは面倒だったので、sed を使って SHELL スクリプトで修正しました。

 grep での検索や sed での置き換えに正規表現を使っています。正規表現はコマンドによって若干の方言がありますが、覚えておくと、文字列操作が非常に楽になります。

ページの日付形式

 各ページには、次のように作成日と更新日を書いています。

<div class="date">2021.03.07 作成</div>
<div class="date">2021.03.30 更新</div>

 これを次のように修正することにしました。

<div class="date"><time datetime="2021-03-07" itemprop="datepublished">2021.03.07 作成</time></div>
<div class="date"><time datetime="2021-03-30" itemprop="datemodified">2021.03.30 更新</time></div>

修正が必要なファイルを探し出す

 grep コマンドで修正が必要なファイルを探します。現在のディレクトリ内のサブディレクトリを含めて、全てのファイルの中で、指定した文字列を含むファイルのファイル名が表示さるようにオプションを指定します。

$ grep -lR "<div class="date">[0-9][0-9][0-9][0-9]\.[0-9][0-9]\.[0-9][0-9].*</div>" .
./Download/index.php
./First.html
  ・
  ・
  ・

sed で修正する。

 sed での修正コマンドを考えます。置き換えの s を使います。作成日と更新日の2つ必要です。次のようになります。

s/\(<div class="date">\)\([0-9][0-9][0-9][0-9]\)\.\([0-9][0-9]\)\.\([0-9][0-9]\)\(.*作成\)\(<\/div>\)/\1<time datetime="\2-\3-\4" itemprop="datepublished">\2.\3.\4\5<\/time>\6/
s/\(<div class="date">\)\([0-9][0-9][0-9][0-9]\)\.\([0-9][0-9]\)\.\([0-9][0-9]\)\(.*更新\)\(<\/div>\)/\1<time datetime="\2-\3-\4" itemprop="datemodified">\2.\3.\4\5<\/time>\6/

 ちょっと長いですが、ファイルの中で他の日付まで置き換えてしまわないように、修正が必要な部分の前後も含めています。

SHELL スクリプト

 SHELLスクリプトにします。grep で見つけたファイルに対して、sed で修正していきます。

#!/bin/bash

search_word="<div class=\"date\">[0-9][0-9][0-9][0-9]\.[0-9][0-9]\.[0-9][0-9].*</div>"

grep -lR "${search_word}" . | \
while
    read file
do
    echo "${file}"
    sed -i "${file}" \
        -e 's/\(<div class="date">\)\([0-9][0-9][0-9][0-9]\)\.\([0-9][0-9]\)\.\([0-9][0-9]\)\(.*作成\)\(<\/div>\)/\1<time datetime="\2-\3-\4" itemprop="datepublished">\2.\3.\4\5<\/time>\6/' \
        -e 's/\(<div class="date">\)\([0-9][0-9][0-9][0-9]\)\.\([0-9][0-9]\)\.\([0-9][0-9]\)\(.*更新\)\(<\/div>\)/\1<time datetime="\2-\3-\4" itemprop="datemodified">\2.\3.\4\5<\/time>\6/'
done

 そのうち Google のクローラがクロールしてくれるでしょう。Google にクロールの要請もできますが、このサイトの内容がそれほど優れているとは思わないので、基本的に要請はしません。クローラのタイミングでクロールしてもらえばいいと考えています。

 以前はクローラが適当に日付を判断してくれていましたが、time 要素がつかえるのなら、その方が正確に判断できるでしょう。知識不足でした。

2021.07.02 追記
 確認してみたら、Google の検索結果に日付が表示されました。作成日と修正日の両方あるページですが、作成日の方が表示されていました。

web サイト

Posted by sirius