今日も元気にテクニカル

技術情報書きたいけど本ブログに書きたくないからこんな名前になりました。

newsingの新着記事リストから個別記事URLを取得する

俺がNEWSING★BOOSTERでやってるのと同じことをHpricotを使ってやってみる。個別記事URLはclass="medium"となっているので、以下のような構文で取り出せる。

require 'hpricot'
require 'open-uri'
require 'kconv'

doc = Hpricot(open("http://newsing.jp"))
(doc/"a.medium").each do |text|
  puts text
end

結果

<a href="http://newsing.jp/entry?url=www.yomiuri.co.jp%2Fentertainment%2Fyy%2Finterview%2F20070517et0a.htm%3Ffrom%3Dos1" class="medium">
						  ・ウ・皈&#58008;ネ、&#57839;ォ、・(2)</a>
<a href="http://newsing.jp/comment?url=http%3A%2F%2Fwww.yomiuri.co.jp%2Fentertainment%2Fyy%2Finterview%2F20070517et0a.htm%3Ffrom%3Dos1&w=open" class="medium"><img src="/common/images/icn/icn_edit02.gif" border="0" height="18" alt="・ウ・皈&#58008;ネ" align="absmiddle" width="20" />
						  ・ウ・皈&#58008;ネ、&#57819;ケ、・/a>

(中略)

<a href="http://newsing.jp/comment?url=http%3A%2F%2Fwww.seikatsuzacca.com%2Fharu_bed%2Findex03.html&w=open" class="medium"><img src="/common/images/icn/icn_edit02.gif" border="0" height="18" alt="・ウ・皈&#58008;ネ" align="absmiddle" width="20" />
						  ・ウ・皈&#58008;ネ、&#57819;ケ、・/a>

ぎゃーす文字化け!と思って

puts text.tosjis

すると

C:/Temp/rb4.tmp:7: undefined method `tosjis&#39; for
 #<Hpricot::Elem:0x2d50c30> (NoMethodError)

で怒られた。どうやら直接Hpricotで抜き出したものはHpricot::Elemというクラスで、なんらかのメソッドをつけてStringクラスにしてやらなければならないらしい。例えばinner_text。

require &#39;hpricot&#39;
require &#39;open-uri&#39;
require &#39;kconv&#39;

doc = Hpricot(open("http://newsing.jp"))
(doc/"a.medium").inner_text.each do |text|
  puts text.tosjis
end

結果

						  コメントを見る (1)
						  コメントをする
(中略)
						  コメントを見る (2)
						  コメントをする

うん文字化け解消。そして不要な「コメントをする」リンクまで取得していることが分かったね。これは後々絞込むとして、俺が欲しいのは個別記事へのURLなんだ。
だが俺はinner_textしかメソッドを知らない!どうする!?