Ruby 使用 Mechanize 抓网页,出现 encoding error 问题

xingbuxing · 2012年10月19日 · 最后由 johnnyhg 回复于 2013年08月05日 · 10188 次阅读

想把这个网页(http://finance.sina.com.cn/oldnews/2012-03-09.html)上的新闻的链接都抓下来,编写如下程序

require 'mechanize' agent = Mechanize.new page = agent.get('http://finance.sina.com.cn/oldnews/2012-03-09.html')

page.links.each do |link| puts link.text end

运行之后出现 encoding error: input conversion failed due to input error,bytes 0xE9 0x46 0xBB 0xF9

程序会有输出,但是输出中只把这个页面中的一部分的链接抓了下来,只抓到这条新闻“2 月 CPI 同比上涨 3.2% PPI 与去年同月持平”,下面的就没有了。

求问大神们如果解决这个问题,谢谢!

完全按楼主的代码运行后出现两条错误信息

> ruby test_mechanize_encoding.rb > test_mechanize_encoding.txt
encoding error : input conversion failed due to input error, bytes 0x46 0xBB 0xF9 0xD6
encoding error : input conversion failed due to input error, bytes 0x51 0x3A 0xD7 0xF6

但是链接倒是全扒下来了,最后几个是


About Sina
广告服务
联系我们
招聘信息
网站律师
SINA English
会员注册
产品答疑
版权所有

加上 encoding 貌似不报错了,但还是不行

require 'mechanize'
agent = Mechanize.new
page = agent.get('http://finance.sina.com.cn/oldnews/2012-03-09.html')
page.encoding = 'gb2312'

page.links.each do |link|
  puts link.text
end

可以尝试换个 html parse

原来可以这样选 encoding。是的,加上 page.encoding 之后就正常不报错了

#2 楼 @cxh116 谢谢您的回答哈,这样子确实不报错了,但是内容还是没有全抓下来,真是不知道为什么

#1 楼 @blacktulip 为什么你那里链接就能全部抓下来呢。。

require 'nokogiri'
require 'open-uri'
url = 'http://finance.sina.com.cn/oldnews/2012-03-09.html'
page = Nokogiri::HTML(open(url))
page.search("a").map(&:text)

没看到乱码

#6 楼 @ywencn 你好 你这个程序运行没有什么输出啊

#7 楼 @xingbuxing 那是需要给代码加上puts

我晕,怎么不能发贴了?

内容没抓完整是 charset 的问题,新浪在 html 声明的是 gb2312,但实际用的是 gbk…

#10 楼 @oCameLo 你是对的,谢谢你

我重定向输出到文件中后,怎么打开时乱码?我使用的是 gb2312。

#2 楼 @cxh116 page.encoding = 'gb2312' 这个方法会报错。我通常是直接用 force_encoding("utf-8") 或者 force_encoding("gbk") 这种方式来处理。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号