前阵子有一个需求,要从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)