1. 安装
gem install nokogiri
2. 类的结构
Nokogiri::HTML::Document < Nokogiri::XML::Document < Nokogiri::XML::Node < Object
Nokogiri::XML::Element < Nokogiri::XML::Node < Object
Nogogiri::XML::NodeSet < Enumerable < Object
3. HTML代码的解析
3.1 取得HTML的DOC对象
doc= Nokogiri::HTML(open(‘http://×××.com’))
3.2 基本的处理模式
tds=doc.xpath("//td") # => td标签検索(得到NodeSet对象)
tds.size # => td标签个数
tds[0] # => 第一个td标签(Element对象)
tds[0]["class"] # => 第一个tdのclass名(String)
tds[0].xpath(".//a") # => 第一个td里面检索a标签(NodeSet对象)
4. Node参照的方法
4.1 检索方法
at(".css") #根据css名,检索这个nodes里面的第一个node(返回一个Element)
css(".css") #根据css名,检索这个nodes里面的所有名为css的node(返回NodeSet)
xpath("XPath") #根据xpath,检索这个nodes里面的所有xpath的路径(返回NodeSet)
search((".css/xpath") #根据xpath或css,检索这个nodes里面的所有xpath/css(返回NodeSet)
例:
Ruby代码
分享到:
- doc = Nokogiri::HTML("<table><td class='a'>test</td><td class='a'></td></table>");
- tds=doc.at(".a");
- print tds.to_html();
显示结果
4.2 自已node的信息
node_name、name | node名(String) |
css_path | 这个node的css(String) |
path | node的XPath(String) |
node_type、type | node类型(Fixnum) |
blank? | 是不是空文字的node |
cdata? | 是不是cdata的node |
text? | 是不是文本node |
commnet? | 是不是注释node |
element?、elem? | 是不是元素node |
也举个例子
Ruby代码
分享到:
- doc = Nokogiri::HTML("<table><td class='a'>test</td><td class='a'></td></table>");
- tds=doc.at(".a");
- print tds.node_name
显示结果
5. NodeSet参照的方法
5.1 検索
at("検索") |
css("样式") |
xpath("XPath") |
search("样式或xpath") |
5.2 Enumerator、Array
length、size |
empty? |
first |
last |
each { |x| 。。。} |
push(node)、<< node |
to_a、to_ary |
5.3 文本处理
inner_text、text |
inner_html |
to_html(*arg) |
to_xhtml(*arg) |
6. 最后举几个例子
6.1 从http://golf.shinh.org/p.rb?FizzBuzz#Ruby网站上采集Ruby的数据
参考代码
Ruby代码
分享到:
- require 'rubygems'
- require 'nokogiri'
- require 'open-uri'
- abort('no argument err.') if ARGV.size == 0
- pxy = "http://172.28.138.13:8080" // 因为我们是局域网,所以加上了代理
- usr = ""
- pss = ""
- options = { :proxy_http_basic_authentication => [pxy,usr,pss] }
- uri = "http://golf.shinh.org/p.rb?FizzBuzz#Ruby"
- doc = Nokogiri::HTML(open(uri,options))
- prog_names = []
- doc.xpath('/html/body/h3/a[@href]').each do |nsa|
- href = ""
- href = nsa.get_attribute("href")
- if href =~ /\/l\.rb\?.*/
- prog_names << nsa.inner_text
- end
- end
- #table
- #tables最後元素「Language Ranking」
- tables = []
- tables = doc.xpath('/html/body/table')
- rank_info = Hash.new
- prog_names.each_with_index do |prog, i|
- if ARGV[0].upcase == prog.upcase
- p prog
- tables[i].xpath('tr').each do |tr|
- user = tr.xpath('td[2]').inner_text
- time = tr.xpath('td[4]').inner_text
- if user != "" && time != ""
- rank_info[user] = time
- end
- end
- end
- end
- puts "Rank User Time"
- puts "------------------------------"
- rank_info.sort_by {|key, val| val}.each_with_index{|x, n| puts "#{n + 1} #{x[0]} #{x[1]}"}
我们看执行结果
6.2 再举一个采集天气的例子
这里我用的日本的一个天气网站 http://weather.asahi.com
参考代码
Ruby代码
分享到:
- #!/usr/bin/ruby -Ke
- require "rubygems"
- require "nokogiri"
- require "open-uri"
- require "kconv"
- abort('no argument err.') if ARGV.size == 0
- pxy = "http://172.28.138.13:8080"
- usr = ""
- pss = ""
- options = { :proxy_http_basic_authentication => [pxy,usr,pss] }
- uri = "http://weather.asahi.com"
- doc = Nokogiri::HTML(open(uri,options))
- doc.search("//table[@class='font12' and @bgcolor]//tr[position()>1]").each do |tr|
- place = tr.search("td[1]").text
- weather = tr.search("td[2] > img").map{|img| img["alt"]}.join("|")
- puts "#{place}\t#{weather}\n".tosjis
- end
执行结果
好了,这插件就先介绍到这里。
来源:oschina
链接:https://my.oschina.net/u/1170956/blog/682215