2007年7月13日 星期五

Parse invalid HTML by Hpricot (2)

關於Hpricot的基本介紹,可以參見前篇,Hpicot的API文件可以參見這篇這篇,怪的是好像沒在官網看到連到這些API網站的鏈結,我從Google找到的。Hpicot雖然好用,但文件似乎沒有很齊,這裡簡單說明crawl web pages會用到的部份。

開檔

可以從檔案或URL開啟,用法:

require 'uri' require 'open-uri' require 'rubygems' require 'hpricot' doc = Hpricot(open('http://fcamel.twbbs.org/'))

會得到一個Hpricot::Doc物件,接著可以使用search()找出特定部份的資料,我都是用CSS path,配合Web Developer查CSS path,容易使用。

Search

example code:

doc.search("//div#sidebar.list/ul/li/a").each do |t| ... end

這個例子裡,search回傳Hpricot::Elements,Elements是類似陣列的資料結構,每個元素的型別是Hpricot::Elem。t.inner_text的型態是String,tag內的純文字;t.attributes[…]是Hash,存放各屬性的值,比方用t.attributes[’href’]取出超鏈結指向的URL。

Hpricot::Elements可以繼續search,可以先取出一大區塊的HTML後,再配合if, else來找資料:

doc.search("//div#sidebar.list/").each do |e| if e.search("//h3.label").inner_text =~ /Introduction/ # find data in <h3 class='label'>Introduction</h3> ... elsif e.search("//h3.label").inner_text =~ /Related Work/ # find data in <h3 class='label'>Related Work</h3> ... end end

沒有留言:

張貼留言