Nokogiri 详细使用方法

自闭症网瘾萝莉.ら 提交于 2020-03-24 10:01:58

3 月,跳不动了?>>>

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代码 

分享到: 

 

  1. doc = Nokogiri::HTML("<table><td class='a'>test</td><td class='a'></td></table>");  
  2. tds=doc.at(".a");  
  3. 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代码 

分享到: 

 

  1. doc = Nokogiri::HTML("<table><td class='a'>test</td><td class='a'></td></table>");  
  2. tds=doc.at(".a");  
  3. 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代码 

分享到: 

 

  1. require 'rubygems'  
  2. require 'nokogiri'  
  3. require 'open-uri'  
  4.   
  5. abort('no argument err.') if ARGV.size == 0  
  6.   
  7. pxy = "http://172.28.138.13:8080" // 因为我们是局域网,所以加上了代理  
  8. usr = ""  
  9. pss = ""  
  10.   
  11. options = { :proxy_http_basic_authentication => [pxy,usr,pss] }  
  12. uri = "http://golf.shinh.org/p.rb?FizzBuzz#Ruby"  
  13.   
  14. doc = Nokogiri::HTML(open(uri,options))  
  15.   
  16. prog_names = []  
  17. doc.xpath('/html/body/h3/a[@href]').each do |nsa|  
  18.   href = ""  
  19.   href = nsa.get_attribute("href")  
  20.   if href =~ /\/l\.rb\?.*/  
  21.     prog_names << nsa.inner_text  
  22.   end  
  23. end  
  24.   
  25. #table  
  26. #tables最後元素「Language Ranking」  
  27. tables = []  
  28. tables = doc.xpath('/html/body/table')  
  29.   
  30. rank_info = Hash.new  
  31. prog_names.each_with_index do |prog, i|  
  32.   if ARGV[0].upcase == prog.upcase  
  33.     p prog  
  34.     tables[i].xpath('tr').each do |tr|  
  35.       user = tr.xpath('td[2]').inner_text  
  36.       time = tr.xpath('td[4]').inner_text  
  37.       if user != "" && time != ""  
  38.         rank_info[user] = time  
  39.       end  
  40.     end  
  41.   end  
  42. end  
  43.   
  44. puts "Rank User Time"  
  45. puts "------------------------------"  
  46. 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代码 

分享到: 

 

  1. #!/usr/bin/ruby -Ke  
  2. require "rubygems"  
  3. require "nokogiri"  
  4. require "open-uri"  
  5. require "kconv"  
  6.   
  7. abort('no argument err.') if ARGV.size == 0  
  8.   
  9. pxy = "http://172.28.138.13:8080"  
  10. usr = ""  
  11. pss = ""  
  12.   
  13. options = { :proxy_http_basic_authentication => [pxy,usr,pss] }  
  14. uri = "http://weather.asahi.com"  
  15.   
  16. doc = Nokogiri::HTML(open(uri,options))  
  17.   
  18. doc.search("//table[@class='font12' and @bgcolor]//tr[position()>1]").each do |tr|  
  19.     place   = tr.search("td[1]").text  
  20.     weather = tr.search("td[2] > img").map{|img| img["alt"]}.join("|")  
  21.     puts "#{place}\t#{weather}\n".tosjis  
  22. end  

执行结果

 

好了,这插件就先介绍到这里。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!