前陣子有一個需求,要從5、60個網頁檔中,抓出需要的資訊。
我稍稍看了一下這些網頁檔原始碼,結構大概是大同小異,而且需要的資料,都有使用id來標示,因此我想於其直接去parse文字,不如透過DOM來抓會更簡單。
雖然我最熟的語言該算是JavaScript,但是由於這些網頁都已經另存成檔案,而且parsing完成的資料又要寫入到文字檔中,所以我就想Ruby來做這個工作。
Ruby是一個很有趣的語言,雖然我的程式開發經驗相當少,但是接觸過Ruby之後,還是被他魔幻般的語法和自由度給吸引住。當初是想玩玩Rails才摸Ruby,沒想到Rails沒繼續玩下去,但是Ruby卻一直吸引著我。
前陣子還直接用Ruby+Active Record+Sqlite寫了一個命令列底下的小應用程式,蠻好玩的。
言歸正傳,雖然喜歡Ruby,但是畢竟應用時間短,也不知道怎麼運用它來parsing DOM,這時就想到iT邦上的Ruby達人CFC,果然MSN給他之後,得到一個漂亮的答案。
Hpricot
Hpricot是基於Tanaka Akira(田中明?)的HTree和John Resig的JQuery選取語法而來的HTML parser,因此可以用XQuery語法和CSS的選取語法來取得DOM元素。
要安裝Hpricot的話,只要用Ruby的gem即可。
gem install Hpricot
安裝好之後,在程式檔的開頭先引用進來
require 'rubygems'
require 'hpricot'
這樣就可以開始使用Hpricot了。
舉一個最簡單的例子,假設我要開啟的文件檔名是位於project資料夾中的1.html,然後要parsing的資料有個id叫bookTItle,透過下面兩行就解決了。
doc = open("project/1.html")
result = doc.at('#bookTitle').innerText()
此外,我也可以操作DOM,例如更改某個<span>的class。
(doc/"span.newCopy").set("class", "hotSale")
另外如果你熟XQuery的語法,在抓特定dom上也很好用。
幾個相關的link供大家參考。
官方網站
Hpricot 引導文件
Hpricot API
ihower寫的介紹(中文)(比這裡寫的專業多了 :p)