`
jsntghf
  • 浏览: 2475896 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

使用Nokogiri解析HTML

阅读更多

首先,我们需要用到nokogiri和open-uri

 

require 'nokogiri'
require 'open-uri'

 

doc = Nokogiri::HTML(open('http://www.google.com/search?q=tenderlove'))

doc.css('h3.r a.l').each do |link|
   puts link.content
end

 

换种方式实现:

 

 doc.xpath('//h3/a[@class="l"]').each do |link|
     puts link.content
 end

 

我们还可以这样来写:

 

 doc.search('h3.r a.l', '//h3/a[@class="l"]').each do |link|
      puts link.content
 end

 

编码问题需要另行转换。

 

结果如下所示:

 

Aaron Patterson (tenderlove) on Twitter
Tender Lovemaking
Force M.D. - Tender Love Lyrics
Force MDs - Tender Love
Jordan Knight - Tender Love
Alicia Keys- Tender Love(live)
tenderlove's nokogiri at master - GitHub
Tender Love and  Care on Flickr - Photo Sharing!
USHER - TENDER LOVE LYRICS
Love Quotes - Tender Love Quotes

分享到:
评论
10 楼 lolomarx 2010-06-10  
用nokogiri 遇到一个问题
直接ruby test.rb就通过,但是在rails 3 下转成rake任务通不过
换成rails 2.3.5的rake任务就能通过
究竟要如何解决呢?
详情参看:http://www.iteye.com/problems/43990
9 楼 windr 2010-06-03  
楼主用的开发环境是什么的?
我用NB6.8 配置nokogiri,但是没搞定。。
8 楼 kenrome 2010-05-22  
wozhidao 写道
在采集的时候编码问题如何解决
rails默认用的utf-8,而我要采集的网站是gb2312
arr = [1,2,3,4,5,6,7,9]
url = "http://www.hishibo.cn?type="
arr.each do |a|
    doc = Nokogiri::HTML(open(url))
    dco.css("table.txt>tr:nth-child(1)>td").each do |c|
      puts c.content
    end
end

目标网页是gb2312编码,有些页面能采回来,有些又提示有 无效的字符编码
doc = Nokogiri::HTML(open(url))

改为
doc = Iconv.iconv("UTF-8","GB2312",Nokogiri::HTML(open(url)))

更离谱,直接错误,返回的信息都是乱码,更不看不懂那有问题


我按照你的这方法试过了,貌似你调用iconv的方法参数写反了,我写的如下:
doc = Iconv.iconv("GB2312//IGNORE","UTF-8//IGNORE",Nokogiri::HTML(open(url)))  

注意:如果不加IGNORE的话,会报错
.. (Iconv::IllegalSequence)
7 楼 fly51fly 2010-03-06  
根据我最新实验的结果,使用GB18030而不是GB2312在jruby环境下更可靠,即使用如下方式编码:
page_data = Iconv.new('GB18030//IGNORE', page_encode).iconv(page_data)
doc = Nokogiri::HTML(page_data, nil, "GB18030") rescue nil

希望对大家有帮助
6 楼 山雨欲来风满楼 2010-01-20  
在windows上的 nokogiri 不需要编码信息就能正确解码中文网页,但是 ubuntu上的 nokogiri 却报编码错误,不知道为什么?回去试试加上编码参数后能不能工作。 用 iconv转出来有几个中文字符可以识别,但是不是原汁原味的了,不知道为什么。
5 楼 jimxl 2010-01-13  
nokogiri的Nokogiri::HTML.parse(contents, nil, 'gb2312')本来就有编码参数的。还是用这个吧。Iconv转换的。有时候再jruby上不行。。
4 楼 Omnibus 2010-01-13  
wozhidao 写道
在采集的时候编码问题如何解决
rails默认用的utf-8,而我要采集的网站是gb2312
arr = [1,2,3,4,5,6,7,9]
url = "http://www.hishibo.cn?type="
arr.each do |a|
    doc = Nokogiri::HTML(open(url))
    dco.css("table.txt>tr:nth-child(1)>td").each do |c|
      puts c.content
    end
end

目标网页是gb2312编码,有些页面能采回来,有些又提示有 无效的字符编码
doc = Nokogiri::HTML(open(url))

改为
doc = Iconv.iconv("UTF-8","GB2312",Nokogiri::HTML(open(url)))

更离谱,直接错误,返回的信息都是乱码,更不看不懂那有问题


curl http://www.hishibo.cn/
此網站原來就用utf-8吧。
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

3 楼 wozhidao 2009-12-28  
ruby这个编码问题真是烦人,加上//IGNORE忽略掉不能转换有字符,还是有部分数据采不到
另外我觉得应该在open(url)这一步转换编码吧?

头痛,采数据这步还是用C#算了,encod == "gb2312" ? Encoding.Default.GetString(wc.DownloadData(url)) : Encoding.UTF8.GetString(wc.DownloadData(url));
2 楼 jsntghf 2009-12-28  
wozhidao 写道
在采集的时候编码问题如何解决
rails默认用的utf-8,而我要采集的网站是gb2312
arr = [1,2,3,4,5,6,7,9]
url = "http://www.hishibo.cn?type="
arr.each do |a|
    doc = Nokogiri::HTML(open(url))
    dco.css("table.txt>tr:nth-child(1)>td").each do |c|
      puts c.content
    end
end

目标网页是gb2312编码,有些页面能采回来,有些又提示有 无效的字符编码
doc = Nokogiri::HTML(open(url))

改为
doc = Iconv.iconv("UTF-8","GB2312",Nokogiri::HTML(open(url)))

更离谱,直接错误,返回的信息都是乱码,更不看不懂那有问题

我举个例子:
    url = "http://www.hishibo.cn"
    doc = Nokogiri::HTML(open(url))
    doc.css("h3").each do |c|
      puts Iconv.iconv("GBK//IGNORE", "UTF-8//IGNORE", c.content)  
    end

输出如下:
商品类别
销售排行
推荐热卖
最新商品
世博会资讯
发货信息
本店最新订单
购物必读
友情链接
1 楼 wozhidao 2009-12-27  
在采集的时候编码问题如何解决
rails默认用的utf-8,而我要采集的网站是gb2312
arr = [1,2,3,4,5,6,7,9]
url = "http://www.hishibo.cn?type="
arr.each do |a|
    doc = Nokogiri::HTML(open(url))
    dco.css("table.txt>tr:nth-child(1)>td").each do |c|
      puts c.content
    end
end

目标网页是gb2312编码,有些页面能采回来,有些又提示有 无效的字符编码
doc = Nokogiri::HTML(open(url))

改为
doc = Iconv.iconv("UTF-8","GB2312",Nokogiri::HTML(open(url)))

更离谱,直接错误,返回的信息都是乱码,更不看不懂那有问题

相关推荐

Global site tag (gtag.js) - Google Analytics