hrkt0115311の、迷えるプログラミング教室  RSSを登録する

プログラミングに興味はありますか? 素人が入門書片手にソースコード書いたりcgi作ったり、迷子になったりするメルマガです。広大なプログラミングの森で、一緒に迷子を楽しんでみませんか?

最新号をメルマガでお届けします    
登録 解除

規約に同意して

登録した方には、まぐまぐの公式メルマガ(無料)をお届けします。
2009/07/19

「hrkt0115311の、迷えるプログラミング教室」Vol.90 ~URL指定すると、はてな記法を返すスクリプトの巻~

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

                                             
                 「hrkt0115311の、迷えるプログラミング教室」Vol.90

━━━━━━━━━━━━━━━━━ URL指定すると、はてな記法を返すスクリプトの巻

おはようございます。前号(Vol.89 ~XML処理するTwitterまとめスクリプト改編の巻)は
私の誤操作により重複配信してしまい、大変失礼いたしました。まぐまぐの管理者画面が
新しくなり、これに不慣れなため起きたミスでした。同じ失敗を繰り返さないよう、
注意してメルマガを配信いたします。

さて、このところ、PythonやPHPの話題が続いていました。今回は久しぶりにRubyで
スクリプトを書きました。では、今号をお届けいたします!


 メルマガを登録して下さってる方、それからLDRに登録して下さってる方、
 初心者のメルマガにおつきあいいただきありがとうございます。
  http://www.mag2.com/m/0000267290.html
  http://reader.livedoor.com/about/http://archive.mag2.com/0000267290/rss10.xml

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
○目次
 ・今回のスクリプトは何か?
 ・できなかったこと
 ・出力結果
 ・ソースコード
━━━━━━━━━━━━━━━━━━━━━━━━━━━免責事項

 ソースコードは、発行者が実際に動かし、構文チェックなどもしていますが
 ご利用になられて万一損害が生じた場合、保証することができません。
 ご利用になられる際は、ご自身でご確認になられた上で、お試し下さい。

━━━━━━━━━━━━━━━━━━言語処理系等の導入について

 Perl,PHP,Python,Rubyの入手先と、XAMPPの入手先を紹介します。

 ○The Perl Directory - perl.org
 http://www.perl.org/

 ○日本PHPユーザ会
 http://www.php.gr.jp/

 ○Python Japan User's Group
 http://www.python.jp/Zope/

 ○Ruby Install Guide
 http://preview.tinyurl.com/4ghc3o

 ○XAMPP
 http://www.apachefriends.org/jp/xampp.html

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

○ 今回のスクリプトは何か?

私は「読むcrossreview」( http://hrkt0115311.tumblr.com/ )というサイトを
やっています。これはTumblrで「crossreview」( http://crossreview.jp/ )で
気になったレビューをクリッピングしていくサイトです。本家crossreviewには
15000件くらいレビューがあります。この中から数千件に目を通し、3200件ほど
クリッピングしています。

この編集過程で、テキスト処理にPythonスクリプトを書いて使っているのですが
Rubyの「hpricot」を使えばもう少し効率化できそうだなと考え試してみました。

 ・今まで
  1.HTMLソースを必要なだけテキストファイルにコピーして保存
  2.Pythonスクリプトで、保存したテキストファイルからURLを取得
  3.URLの中から必要なものだけ残し、秀丸ではてな記法に書き換える

 ・今回のスクリプトを使うと
  1.Rubyのスクリプトを走らせると、はてな記法が出力される


たいした違いではないのですが、ちょっとだけ楽になりました。ちなみに、出力した
はてな記法は、はてなダイアリーを使ってHTMLに変換し、以下のようにその日に
公開した分をまとめるのに用いています。

 ○今日の読むcrossreview | なマレンジどん
 http://hrkt0115311.org/2009/07/002983.html

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

○ できなかったこと

URLを渡すと、タイトルとURLをハッシュで管理し、

<li><a href="http://hrkt0115311.tumblr.com/post/143407542">読むcrossreview - 
空気のトリセツ...</a><a href="http://b.hatena.ne.jp/entry/http://hrkt0115311.
tumblr.com/post/143407542"><img src="http://b.hatena.ne.jp/entry/image/http://
hrkt0115311.tumblr.com/post/143407542"></a></li>

↑こんな感じに整形して、HTMLのリストにしたかったのです。

・Tumblrは個別ページに行かないとタイトル要素が取れない
 (リンク先にはタイトルが含まれない)

・必要なページに読みに行かせると、タイトルとURLだけでなく、そのページに含まれる
 全てのURLとタイトルを引っこ抜いてきてしまう

・処理に時間がかかる

・正規表現を使って、crossreviewのURLを取得先URLから外そうとしたのですが
 うまくいきませんでした。
 「http:\/\/crossreview.jp\/[a-zA-Z0-9_]+\/reviews\/[0-9_]+」
 正規表現は、これでマッチするはずなのですけれども……。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

○ 出力結果

-[http://hrkt0115311.tumblr.com/post/143407542:title:bookmark]
-[http://hrkt0115311.tumblr.com/post/143407458/ix:title:bookmark]
-[http://hrkt0115311.tumblr.com/post/143407392/v:title:bookmark]
-[http://hrkt0115311.tumblr.com/post/143407316/253-book:title:bookmark]
-[http://hrkt0115311.tumblr.com/post/143407171:title:bookmark]
-[http://hrkt0115311.tumblr.com/post/143401017/php:title:bookmark]
-[http://hrkt0115311.tumblr.com/post/143400937/denim:title:bookmark]
-[http://hrkt0115311.tumblr.com/post/143400884:title:bookmark]
-[http://hrkt0115311.tumblr.com/post/143400841:title:bookmark]
-[http://hrkt0115311.tumblr.com/post/143400770/1:title:bookmark]
-[http://hrkt0115311.tumblr.com/post/143400723:title:bookmark]
-[http://hrkt0115311.tumblr.com/post/143400671/kc:title:bookmark]
-[http://hrkt0115311.tumblr.com/post/143400626:title:bookmark]
-[http://hrkt0115311.tumblr.com/post/143400568:title:bookmark]
-[http://hrkt0115311.tumblr.com/post/143400518/4000-dvd:title:bookmark]
-[http://hrkt0115311.tumblr.com/post/143400397:title:bookmark]
-[http://hrkt0115311.tumblr.com/post/143400215/wii-wii:title:bookmark]
-[http://hrkt0115311.tumblr.com/post/143400140:title:bookmark]
-[http://hrkt0115311.tumblr.com/post/143400070/dvd:title:bookmark]
-[http://hrkt0115311.tumblr.com/post/143399975/pluto-1:title:bookmark]
-[http://crossreview.jp/watthy/reviews/B000069SPZ:title:bookmark]
-[http://crossreview.jp/watthy/reviews/4091875718:title:bookmark]
-[http://crossreview.jp/smashmedia/reviews/B000LXD7HO:title:bookmark]
-[http://crossreview.jp/smashmedia/reviews/4591104303:title:bookmark]
-[http://crossreview.jp/sei/reviews/B000WN67L6:title:bookmark]
-[http://crossreview.jp/mumrik/reviews/B000O76P6M:title:bookmark]
-[http://crossreview.jp/mumrik/reviews/4896422104:title:bookmark]
-[http://crossreview.jp/momochin/reviews/456970753X:title:bookmark]
-[http://crossreview.jp/manga/reviews/4166603035:title:bookmark]
-[http://crossreview.jp/hrkt0115311/reviews/B00008OJU3:title:bookmark]
-[http://crossreview.jp/hrkt0115311/reviews/4882840707:title:bookmark]
-[http://crossreview.jp/hrkt0115311/reviews/406372302X:title:bookmark]
-[http://crossreview.jp/hokuto/reviews/4091874312:title:bookmark]
-[http://crossreview.jp/hokuto/reviews/4062741873:title:bookmark]
-[http://crossreview.jp/hair5mm/reviews/B000A16D3C:title:bookmark]
-[http://crossreview.jp/ayohata/reviews/B0027ZXZIU:title:bookmark]
-[http://crossreview.jp/anrakuisu/reviews/4062638878:title:bookmark]
-[http://crossreview.jp/anrakuisu/reviews/4062637707:title:bookmark]
-[http://crossreview.jp/akane/reviews/4122044286:title:bookmark]
-[http://crossreview.jp/4416/reviews/B000UTI27E:title:bookmark]

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

○ ソースコード

#!/usr/bin/ruby -Ku
require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'kconv'


#ブロック内で配列を定義するとスコープの問題が起きるので、外で定義。
target_url = []
target_url_s =[]
delete_url = []
a = []

set_url = ["http://hrkt0115311.tumblr.com/","http://hrkt0115311.tumblr.com/page/2"]

set_url.each do |a_href|
  doc = Hpricot( open(a_href).read )

  (doc/:a).each do |link|
    target_url << link[:href]
  end
end


#配列から直接削除出来なかったので、配列から配列を引くことで削除
#たんぶらのURLのみ取得したいので、その他の要素を削除

delete_url << target_url.delete("http://www.tumblr.com/")
delete_url << target_url.delete("/page/1")
delete_url << target_url.delete("/page/2")
delete_url << target_url.delete("/page/3")
delete_url << target_url.delete("/rss")
delete_url << target_url.delete("http://hrkt0115311.org/")
delete_url << target_url.delete("http://form1.fc2.com/form/?id=171478")
delete_url << target_url.delete("http://crossreview.jp/")
delete_url << target_url.delete("/")
delete_url << target_url.delete("/archive")

#配列 target_url から delete_url を引き、 a に保存
a = target_url - delete_url

#降順ソートと重複削除を行っている
target_url_s = a.sort.reverse.uniq


#配列をはてな記法で出力する
target_url_s.each do |i|
  puts "-[#{i}:title:bookmark]"
end


■ 編集後記
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

久しぶりにRubyで書きました。すっかり忘れていて、ググって書いて少しずつ
思い出しました。配列の操作で、正規表現でマッチしたものを抜き出すとか、
正規表現でマッチしたものを削除するとか、要素を削除するとか、このへんが
うまくできませんでした。なので、回りくどいスクリプトになってると思います。

配列 set_url で指定するURLを変更すれば、出力も変化します。ページ数を
増やすほど処理に時間かかると思います。

・関連エントリ
 http://d.hatena.ne.jp/hrkt0115311/20090718/1247871223
 http://d.hatena.ne.jp/hrkt0115311/20090717/1247806593

それでは、また次号でお会いしましょう。


■ いただいた反響について
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

「こんな仕組み作れないかな」とか「説明不足で分からないよ」といったご指摘を
お寄せいただけると嬉しいです。みなさまの声で、メルマガを育てていきたいです。

また、頂戴したメールをこのメルマガで紹介させていただくかもしれません。
もし、公開を望まれない場合は、恐れ入りますが、「発行者のhtkt0115311に読んで
欲しいだけで、メルマガには掲載しないで」などとお書き下さると助かります。

■ 転送や再配布について
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 このメルマガをご紹介いただく際は、
 このメルマガのURL http://www.mag2.com/m/0000267290.html などを
 並記し、私の書いた文章であると分かる形にして下さると幸いです。
 メルマガの転送については、転送者さん・転送されたメールを受信される方に
 迷惑でない範囲であれば歓迎いたします。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 メールマガジン「hrkt0115311の、迷えるプログラミング教室」

 ○発行者      htkt0115311(どんジレ)
 ○発行システム  『まぐまぐ!』 http://www.mag2.com/
 ○配信中止はこちら http://www.mag2.com/m/0000267290.html
 ○公式サイト    http://enjoy-programming.g.hatena.ne.jp/hrkt0115311/
 ○blog       http://hrkt0115311.blog10.fc2.com/
 ○Twitter     https://twitter.com/hrkt0115311
 ○はてなハイク   http://h.hatena.ne.jp/hrkt0115311/
 ○Wassr      http://wassr.jp/user/hrkt0115311
 ○お問い合わせ   enjoy.ruby@gmail.com

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
最新号をメルマガでお届け
登録 解除

規約に同意して

登録した方には、まぐまぐの公式メルマガ(無料)をお届けします。

最近の記事

上へ戻る