GoogleCodeSearchで指定URL以下のコードを検索する

はこべにっき# - GoogleCodeSearchでブログ上のコードを表示で触れたように、GoogleCodeSearchで、あるURL以下のソースコードを取得するのは少々メンドウです。

しかし、少し検索クエリを工夫すると、そこそこ正確にあるURI以下のソースコードを見つけることができます。たとえば、以下のようなキーワードを用いてGoogleCodeSearchで検索すると、このブログの記事を見つけることができます。

^hakobe932/ package:"http://d.hatena.ne.jp"

検索結果を見ると、このブログのコードが表示されているのがわかります。packageでドメインをしぼるのと、正規表現を用いてURLパス以外がマッチしないように、表現を限定しています。

この機能が簡単に利用できるようにブックマークレットを作ってみました。Google Code Search by URIで公開しています。現在ブラウザで表示しているURL以下のコードをGoogleCodeSearchで表示します。使ってみて下さい。

CGIが裏で走っていますが、ちょっとURL整形してリダイレクトしてるだけなのでJavascriptとかでも作れそうですね。

GoogleCodeSearchは他に、XMLで検索結果を出力できるので、プログラム内で利用することも可能です。くわしくは、Google Code Search Data API Overviewに記載があります。

Google Code Search by URIでも、ちょっと使ってみています。URLを入力して、Seachを押すとXMLから情報を取得して表示してみています。

コード本体はXMLに入っていないので、強引に抽出する必要があります。私は、GoogleCodeSearchのコード本体の載っているURLを引数にとる、以下のような関数を作って、抽出しました。

use URI;
use Web::Scraper;
sub extract_code {
    my ($url) = @_;

    my $scraped = scraper {        
        process '//td[@width="100%"]/pre', 'code' => 'TEXT';
        process '//span[@class="a"]', 'info[]' => 'TEXT';
        result 'code', 'info';
    }->scrape(URI->new($url));
    my $result = {
        url        => $scraped->{info}->[1],
        google_url => $url,
        code       => $scraped->{code},
        language   => $scraped->{info}->[-1],
    };

    return $result;
}

やはり、Web::Scraper便利便利。

公開されているAPIだけでもわりと使えそうですね。ブログ記事上のコード抽出はGoogleCodeSearchに任せることができそうです。クロール対象に入ってなさそうなサイト(nowaとか)も結構あるのがちょっ難点ですが。