Hatena::Diary

どんなジレンマ このページをアンテナに追加 RSSフィード

2009-08-26

「みそ録 | 「みそ文」カテゴリ別目次(自動生成)」出来たよ!


どうやらみそさんの「みそ文 」は、現在、上記二つのカテゴリ別目次が存在します。一つは僕が手動更新かけているもの。一つは、id:SaitoAtsushiid:SaitoAtsushiさんが作って下さった「みそ文カテゴライザ」というFireFoxユーザースクリプトインストールする方法です。

手動更新だと即時反映がなかなかできません。ユーザースクリプトを入れてしまえば問題は全て解決するのですけれども、アドオン入れたりするの慣れていない方もいらっしゃると思うのです。それで、PHPで目次をスクレイピングしてカテゴリ別に並べ替えてみました。残念ながら、今の私の技量だと、「自動更新」(即時反映)と「カテゴリソート」は実装できたのですが、カテゴリの中で記事を時系列順に並べることができませんでした。これは、改善できたらいつか改善したいです。

あ、そうそう。カテゴリ別にこだわらないのであれば、FC2ブログ時系列に並べてくれる全記事一覧 http://douyaramiso.blog59.fc2.com/archives.html も便利ですよー。


ブラウザチェック


残念なことに、インターネットエクスプローラでは真っ白になってしまい表示することができませんでした。原因不明です。すみません。GoogleChromeSafari文字化けするので、恐れ入りますがエンコードUTF-8に手動で設定してあげて下さい。FireFoxOperaは問題なく表示できました。


コピーライト表示

all contents by douyara-miso , assist by id:hrkt0115311 | Design by Kumiko

こう書きました。コンテンツはみそさん。お手伝いがどんジレ。フリーデザインテンプレート作者さんがKumikoさん、です。


意識したこと

色が薄くてもしかしたらお年を召した方には見えにくいかもなのですが、一応、デフォルトよりも文字サイズを大きめに、かつデザインシンプルなものを選びました。


謝辞

WEBスクレイピングにはhtmlSQLを使いました。

http://www.php-seed.net/blog/archives/159

上記コンテンツが参考になりました。感謝します。


公開した目次

みそ録 | 「みそ文」カテゴリ別目次(自動生成)

作った目次はこれです。「カテゴリ別ではあっても時系列がおかしいこと」「IEで表示できないこと」が大問題なのですけれども、それでも良かったら使ってやって下さい。


これから読者になる方々へ(再掲)

はてなアンテナLDRGoogleリーダーはてなRSS等に登録しておくと巡回しやすいですよね。以下、登録用URLを用意しました。どうぞご利用下さい。


ソースコード



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="JA">
<head>
<meta http-equiv="Content-Type" content="text/html; UTF-8" />
  <title>みそ録 | 「みそ文」カテゴリ別目次(自動生成)</title>
  <style type="text/css" media="all">
	@import "style.css"; 
  </style>
</head>

<body>
  <div id="content">
    <div id="top">
        <a href="http://douyaramiso.blog59.fc2.com/">Home</a>&nbsp;&nbsp;
        &nbsp;&nbsp;
        <a href="http://twitter.com/hrkt0115311" title="「みそ録」管理者に連絡する">Contact</a>&nbsp;&nbsp;
    </div>
    <div id="header">
      <h1><a href="index.php">みそ録</a><br/><em>「みそ文」カテゴリ別目次(自動生成)</em></h1>
    </div>
	
    <div id="left">
    
    </div>
    <div id="page">
     <h2>目次</h2>


<?php
include_once("snoopy.php");
include_once("htmlsql.php");

$wsql = new htmlsql();

    // connect to a URL

if (!$wsql->connect('url', 'http://douyaramiso.blog59.fc2.com/archives.html')){
    echo $wsql->error;
    exit;
}

if (!$wsql->query('SELECT href as url, text FROM a')){
    echo $wsql->error;
    exit;
}


$tmp = array();
$tmp2 = array();
$tmp3 = array();

$i = 0;
$j = 0;

foreach($wsql->fetch_array() as $row){
  if($row[text] != "続きを読む"){
    if($row[url] != "http://blog.fc2.com/"){
      if($row[url] != "http://douyaramiso.blog59.fc2.com/"){

            #記事タイトルが入る
          if($i%2 !=1 ){
            array_push($tmp, '<a href="http://douyaramiso.blog59.fc2.com/'.($row[url]).'">'.($row[text]).'</a><br/>');
            $i++;
          }
          else{
            #カテゴリ名が入る
            array_push($tmp2, '<a href="http://douyaramiso.blog59.fc2.com/'.($row[url]).'">'.($row[text]).'</a>');
            $i++;
          }
      }
    }
  }
}

foreach($tmp2 as $a){
    array_push($tmp3, $a." ".$tmp[$j]);
$j++;
}

sort($tmp3);
foreach ($tmp3 as $b) {
    echo $b;
}


?>

<br><br>
     <h2>補足</h2>
<p>09年8/26現在、「自動生成」と「カテゴリ別分類」のみを実装しました。新着順に表示させたかったのですが、上手く行きませんでした。恐れ入りますが、新着順についてはFC2ブログが自動生成する「<a href="http://douyaramiso.blog59.fc2.com/archives.html">全記事一覧</a>」もあわせてご利用いただければ幸いです。<br>
<br>
なお、<a href="http://d.hatena.ne.jp/hrkt0115311/20090814/1250243227">「みそ文カテゴライザ」の導入方法</a>もまとめてあります。よろしければこちらもご参照下さい。</p>
    </div>

    <div id="foot">
      <p>&copy; 2009 all contents by <a href="http://douyaramiso.blog59.fc2.com/">douyara-miso</a> , assist by <a href="http://d.hatena.ne.jp/hrkt0115311/">id:hrkt0115311</a> | Design by <a href="http://www.kumi.co.nr">Kumiko</a></p>
    </div>
  </div>
</body>
</html>


関連エントリ

SaitoAtsushiSaitoAtsushi 2009/08/26 14:34 meta タグでの content プロパティのところは content="text/html; charset=UTF-8" ではないですか。
キャラセットの指定が解釈されず化けてしまうのだと思います。
また、IE では Content-Type の指定ごとなかったことになってしまってどのように解釈すればいいのかわからなくなってしまうのだと思います。
あと、 br の閉じタグがないので invalid です。

SaitoAtsushiSaitoAtsushi 2009/08/26 15:11 for($i=count($tmp2);$i!=1;$i--) {
for($k=0; $k<$i-1; $k++) {
if($tmp2[$k] < $tmp2[$k+1]) {
$t = $tmp2[$k];
$tmp2[$k] = $tmp2[$k+1];
$tmp2[$k+1] = $t;
$t = $tmp[$k];
$tmp[$k] = $tmp[$k+1];
$tmp[$k+1] = $t;
}
}
}

以上を $tmp3 を作る処理の前に入れ、 sort($tmp3); を消せばよいと思います。
私自身は PHP で書くのは初めてな上、処理系をインストールせず脳内処理系でやってます。
そんなわけで複雑なものをまともに動く自信が無かったので、バブルソートにしてしまいました。
速度的には遅いかもしれません。 というかちゃんと動かないかもしれません。

hrkt0115311hrkt0115311 2009/08/26 18:55 id:SaitoAtsushiさんこんにちは!!
沢山教えて下さってありがとうございます。

・メタタグ直したところ、文字化けも直り、IEでの表示も可能になりました。次に同じ問題が起きたら、まずメタタグを疑います。
・br→br/の修正も行いました。お恥ずかしい////
・バブルソート! 脳内処理系に乾杯です。動きました!! ソートがおかしくなってしまう問題、解消できました。ありがとうございます!!!!

----こんな風に直しました。

for($i=count($tmp2);$i!=1;$i--) {
for($k=0; $k<$i-1; $k++) {
if($tmp2[$k] < $tmp2[$k+1]) {
$t = $tmp2[$k];
$tmp2[$k] = $tmp2[$k+1];
$tmp2[$k+1] = $t;
$t = $tmp[$k];
$tmp[$k] = $tmp[$k+1];
$tmp[$k+1] = $t;
}
}
}

foreach($tmp2 as $a){
array_push($tmp3, $a." ".$tmp[$j]);
$j++;
}

foreach ($tmp3 as $b) {
echo $b;
}

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。



アフィリエイトプログラムに関して




このblogは、Google AdSenseと、上記プログラムに参加しています。