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 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-
2009/08/27 「hrkt0115311の、迷えるプログラミング教室」Vol.91 ~htmlSQLで「みそ録」作ったよ! の巻~
-
2009/07/13 「hrkt0115311の、迷えるプログラミング教室」Vol.89 ~XML処理するTwitterまとめスクリプト改編の巻~
-
2009/07/13 「hrkt0115311の、迷えるプログラミング教室」Vol.89 ~XML処理するTwitterまとめスクリプト改編の巻~
-
2009/04/25 「hrkt0115311の、迷えるプログラミング教室」Vol.88 ~HTMLの部分置き換えスクリプトの巻~
-
2009/04/22 「hrkt0115311の、迷えるプログラミング教室」Vol.87 ~HTMLからURLを引っこ抜いてますの巻~


