朝顔日記

Another 朝顔日記見出し一覧の作り方

2003-12-25

さっき作ったAnother 朝顔日記見出し一覧の作り方を忘れないうちに書いておきます。

初めは、月ごとの html ファイルを落としてきてそれに xslt かまして、見出し一覧を作れば一発だろうと考えましたが、考えてみたらはてなダイアリーは xhtml ではないので、そのままでは使えないということに気が付きました。のちのち自動生成できるようにしたいので、エディタでちまちま編集するのは避けたかったので、perl を使うことにします。

以下が、私のはてな日記から、日記の見出し行(h2 および h3 )を抽出して多少加工する perl スクリプトです。このサイトの文字コードはメインが Shift_JIS なので、euc なはてな日記 の見出し行を Shift_JIS でするようにしています。名付けて、hatena_midasi.pl

#!/usr/bin/perl
require "jcode.pl";
print
<<__HTML__;
<?xml version="1.0" encoding="Shift_JIS"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>見出し一覧</title>
</head>
<body>
__HTML__

while(<>){
  @midasi = /<h[23]><a href=.+/g;
  foreach $midasi (@midasi){
    &jcode'convert(\$midasi,'sjis');
    $midasi =~ s/href=".\//href="http:\/\/d\.hatena\.ne\.jp\/nyama\//g;
    $midasi =~ s/■//g;
    $midasi =~ s/<a href=[^>]+>編集<\/a>//g;
    print "$midasi\n";
  }
}
print "</body>\n</html>\n";

例えば、2003年2月の日記のファイルは、200302 というファイルなので、コマンドプロンプトで以下のようにスクリプトを走らせます。

perl hatena_midasi.pl 200302 > 200302.xml

これで、こんな感じの日記の見出し行だけが得られます。


<h2><a href="http://d.hatena.ne.jp/nyama/20030228"><span class="date">2003-02-28</span></a> <span class="title">(fri)</span> </h2>
<h3><a href="http://d.hatena.ne.jp/nyama/20030228#1046413439" name="1046413439"><span class="sanchor"></span></a> [<a href="http://d.hatena.ne.jp/nyama/searchdiary?word=%2a%5b%c6%fc%b5%ad%5d" class="sectioncategory">日記</a>]続・髭剃り <span class="timestamp">15:23</span></h3>
<h3><a href="http://d.hatena.ne.jp/nyama/20030228#1046404750" name="1046404750"><span class="sanchor"></span></a> [<a href="http://d.hatena.ne.jp/nyama/searchdiary?word=%2a%5b%c6%fc%b5%ad%5d" class="sectioncategory">日記</a>]髭剃り <span class="timestamp">12:59</span></h3>
(後略)

これに、midasi.xsl という以下の xslt をかませます。


<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:x="http://www.w3.org/1999/xhtml"
  exclude-result-prefixes="x" >
  <xsl:output method="html" version="1.0" encoding="Shift_JIS"
    indent="yes"
    omit-xml-declaration="no"/>
  <xsl:template match="/">
        <ul>
          <xsl:apply-templates select="x:html/x:body/x:h3"/>
        </ul>
  </xsl:template>
  <xsl:template match="x:html/x:body/x:h3">
    <li><xsl:value-of select="preceding::x:h2[position()=1]"/> <a href="{child::x:a/@href}"><xsl:value-of select="self::node()"/></a></li>
  </xsl:template>
</xsl:stylesheet>

コマンドラインで、以下のようにして実行します。

msxsl 200302 midasi.xsl -o h200302

これにより、こんな感じの見出しのリストが得られます。


<ul xmlns="http://www.w3.org/1999/xhtml">
<li>2003-02-28 (fri) <a href="http://d.hatena.ne.jp/nyama/20030228#1046413439"> [日記]続・髭剃り 15:23</a></li>
<li>2003-02-28 (fri) <a href="http://d.hatena.ne.jp/nyama/20030228#1046404750"> [日記]髭剃り 12:59</a></li>
(後略)

これを各月ごとに行い、得られたリストを、見出し一覧ページで SSI を使ってインクルードして出来上がりです。

ul要素になんかくっついていますが、気にしない方向で。:p)

つか、インクルードしないで、各月の見出しを連結して見出し一覧のページ全体を生成させればいいのか。と今気が付きました。ま、また今度ね。:p)

「Another 朝顔日記見出し一覧の作り方」へコメントをつける

書き込み時の挙動について
URI らしき文字列には自動的にリンクが張られます。また "<" や、">" は実体参照化されます。
スパム対策のため、リファラを切っていると投稿できません。

この記事の永続的 URI ならびに トラックバック ping URI
http://diary.noasobi.net/2003/12/diary_031225b.html