Categories
Programming Ruby

用 Hpricot 來 parsing HTML

Update(2009): 新的 Ruby XML parsing 王道是 nokogiri 了 (via The State of XML Parsing in Ruby (Circa 2009))。

Hpricot 是個快又好用的 Ruby HTML parser,點子來源是 JQuery。它的兩大優點是 1.速度快,因為核心用C改寫了 2.好用的介面,你可以用CSS selectors,element IDs,tag types 等。

其它的優點還有可以吃 XML,可以吃 invaild 的 HTML,甚至可以更改 document 結構。

首先是安裝

gem install hpricot

基本用法

require 'rubygems'
require 'hpricot'
document = <<END
<ul>
<li>first item</li>
<li>second item</li>
</ul>
END
doc = Hpricot.parse(document)
(doc/'li').each do |item|
puts item.inner_html
end

出來的結果就是 first item 跟 second item 囉。其中 (doc/’li’) 意同 doc.search(‘li’),就是搜出 li 這個 tag。

進階用法

可跑 nested 迴圈,而除了 inner_html,也可以抓屬性值如 attributes[‘href’] 。我拿交大某站來練習一下:

require 'rubygems'
require 'hpricot'
require 'open-uri'
url = "http://www.pac.nctu.edu.tw/news/news_msg.php"
doc = Hpricot(open(url))
doc.search('table tr td div.tbCopy font').each do |item|
(item/'a').each do |nav|
puts nav.attributes['href']
puts nav.inner_html
end
end

心得是若 HTML 有好的結構,則 hpricot 可以快速走訪到你想要的位置。例如有設定 element IDs 或 class 的話,就可以用 doc.search(‘table#myid’) 或 doc.search(‘span.myclass’) 快速到位。

不過就算是如上述的老式HTML網站,要找 CSS selector 只要搭配服用 firefox extension Web Developer 也不難解決,點選 CSS > View Style Information 就可以看到路徑了。

3 replies on “用 Hpricot 來 parsing HTML”

[…] ?????? stickeraction ???? php ?? cron job ???????, ?????, ???? cron job ??? ruby ??? python ???????, ???????????????????, ??????? ruby???????? ruby ????? HTML DOM ???, ???? Hpricot, ??????? phpQuery ???, ???? jQuery ?????? DOM, ?! ?????!??????????? RSS feed url ??require ‘open-uri’require ‘rubygems’require ‘hpricot’def get_feedurl url doc = Hpricot(open(url)) link_tag = doc.at(“head > link[@rel=’alternate’][@type^=’application’]”) if link_tag return link_tag.get_attribute(‘href’) end return nilendurl = ‘http://tzangms.com/blog’puts get_feedurl(url)???????????, ????????? html, ???? Hpricot ? html ??? RSS feed url? ??? ruby ??????????, ???? google ??? Orz anyway, ??????? php ?????:require ‘phpQuery.php’;function get_feedurl(url) { phpQuery::get($url); return (string) pq(‘head > link[@rel=alternate][@type^=application]:first’)->attr(‘href’);}$url = ‘http://tzangms.com/blog’;echo get_feedurl($url);?~ ??? ruby ?????! ???????? Orz[????]? Hpricot ? parsing HTML – {|ihower.idv.tw| blog } […]

Leave a Reply

Your email address will not be published. Required fields are marked *