XPathRSS

最近のグラフ : XPathGraphRSSがなかったので、去年のはじめに作ろうとしてたのをてきとう実装だけど作った。
bookmarkletを呼ぶとAutoPagerize IDEのすごくしょぼいやつがでてくるのでxpathを入れて保存したらRSSatomになって出てくる。
あれー、ブックマークレットだめなのかー。XPathRSSにあります。


こんなの。

contentはノードになるようなxpathをいれるとそのノードを含めた子ノードのHTMLがそのままはいるかんじ。日付はみんなどうやってるの? 汚いコード書いてだいたい日付なやつはパースできるようにした。

でてくるatomはこんな。最近のグラフ - XPathRSS

XPathjsonで取り出せる。jsonp版。

Web::ScraperみたいにparagraphをXpathで表すようにすると、xpathが複数のノードにマッチしてもよくなるので、contentの中身をわりと自由にかけるようになるんだけどそうするとxpathをひとつ多く書くことになってめんどくさいのでやめた。(ほとんどのHTMLでは)でも各フィールドからparagraphは簡単に推定できるのでやればできる。


はじめpipesXPathモジュール作ればいいじゃんと思ったんだけど、pipesでやる意味がほとんど意味がなくてやめた。AutoPagerize IDEのガワはもともとこれを任意の数のフィールドつくってやれるようにするために作ったもので、だから増やしたり減らしたりできるようにしてた(いまよりもヘタだったのであきらめた気もする)。google baseの純粋にXMLデータが入れられるバージョンを作りたい。1年経ってまた同じところに戻ってきてる。でも前は持ってなかったものをいくつか手に入れてるぞ。

jsAutoPageScraperを朝みたのとは関係ないんだけど、似たものを作ってるところにあとから驚いた。

それにしてもXpathGraphかっこいい。


jsのツリーはてきとうに検索したらdtreeっていうのがでてきたからそれにしたけどあんまりかっこよくなかった。

class DataParser {
        static function parse($s) {

                $t = array(
                        'tm_year' => date("Y"),
                        'tm_hour' => 0,
                        'tm_minute' => 0,
                        'tm_second' => 0,
                );
                if ( preg_match( '/(\d{1,2}):(\d{2})(:(\d\d))?/', $s, $m ) ) {
                        $t['tm_hour']           = preg_replace( '/^0/', '', $m[1]);
                        $t['tm_minute']         = preg_replace( '/^0/', '', $m[2]);
                        if ($m[4] != '' ) {
                                $t['tm_second'] = preg_replace( '/^0/', '', $m[4]);
                        }
                }

                if ( preg_match( '%(?:(\d{2,4})\s*([./]))?\s*(\d{1,2})\s*[./]\s*(\d{1,2})%', $s, $m ) ) {
                        if ($m[1] !== '' ) {
                                $y = preg_replace( '/^0/', '', $m[1]);
                                if ($y < 2000 ) {
                                        $y += 2000;
                                }
                                $t['tm_year'] = $y;
                        }
                        $t['tm_mon']  = preg_replace( '/^0/', '', $m[3]);
                        $t['tm_mday'] = preg_replace( '/^0/', '', $m[4]);

                }

                if ( preg_match( '%(\d{2,4})\s*年%', $s, $m ) ) {
                        $y = preg_replace( '/^0/', '', $m[1]);
                        if ($y < 2000 ) {
                                $y += 2000;
                        }
                        $t['tm_year'] = $y;
                }
                if ( preg_match( '%(\d{2})\s*月%', $s, $m ) ) {
                        $y = preg_replace( '/^0/', '', $m[1]);
                        $t['tm_mon'] = $y;
                }
                if ( preg_match( '%(\d{2})\s*日%', $s, $m ) ) {
                        $y = preg_replace( '/^0/', '', $m[1]);
                        $t['tm_mday'] = $y;
                }

                if ( $t['tm_mon'] and $t['tm_mday'] ) {
                        return mktime(
                                $t['tm_hour'],
                                $t['tm_minute'],
                                $t['tm_second'],
                                $t['tm_mon'],
                                $t['tm_mday'],
                                $t['tm_year']
                        );
                } else {
                        return 0;
                }

        }

        function test() {
                $formats = array(
                        '2008.10.12 20:00:00',
                        '2008年10月12日 20:00:00',
                        '2008年10月12日 20:00',
                        '08.10.12',
                        '10月12日',
                        '10/12',
                        '10.12',
                        '10-12',
                );

                foreach ( $formats as $k => $s ) {
                        print dateparser($s);
                        print "\n";
                }
        }

};