Nokogiri和Mechanize问题

时间:2011-03-04 09:52:36

标签: ruby nokogiri mechanize

我在机械化doc站点上做了一个示例,我想使用解析结果 引入nokogiri。

我的问题是当执行以下行时:

doc = Nokogiri::HTML(search_results, 'UTF-8' )

发生以下错误:

C:/Ruby192/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4.1-x86-mingw32/lib/nokogiri/html/document.rb:71:in `parse': undefined method `name' for "UTF-8":String (NoMethodError)
    from C:/Ruby192/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4.1-x86-mingw32/lib/nokogiri/html.rb:13:in `HTML'
    from mechanize_test.rb:16:in `<main>'

我在windows vista机器上安装了ruby 1.9

mechanize返回的结果是非拉丁语(utf8)

代码示例如下。

# encoding: UTF-8

 require 'rubygems'
 require 'mechanize'
 require 'nokogiri'

 agent = Mechanize.new
 agent.user_agent_alias = 'Mac Safari'
 page = agent.get("http://www.google.com/")
 search_form = page.form_with(:name => "f")
 search_form.field_with(:name => "q").value = "invitations"
 search_results = agent.submit(search_form)
 puts search_results.body

 doc = Nokogiri::HTML(search_results, 'UTF-8')

2 个答案:

答案 0 :(得分:5)

@Douglas Drouillard

Thanx对此进行调查。我发现我犯了一个错误。对nokogiri的呼吁应该是:

doc = Nokogiri::HTML(search_results.body, 'UTF-8')

请注意,search_resultssearch_results.body不同。

Search_results包含来自机械化实例化的信息 虽然search_resuls.body包含html utf8 信息,但nokogiri可以解析没问题。

答案 1 :(得分:2)

这似乎是Nokogiri期望作为被调用的解析方法的参数的问题。我看到的第一个问题是你在错误的参数插槽中传递编码选项,

来自Nokogiri项目页面的parsing example,用于指定编码

Nokogiri.XML('<foo><bar /><foo>', nil, 'EUC-JP')

请注意,编码是第三个参数,而不是第二个参数。但这仍然无法完全解释您所看到的行为,因为编码应该被忽略。

根据Nokogiri文档,调用Nokogiri :: HTML()是解析方法的便捷方法。

Nokogiri的代码:: HTML :: parse

   def parse thing, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_HTML, &block
      document.parse(thing, url, encoding, options, &block)
   end

Nokogiri :: HTML :: Document解析方法的source有点长,但这里是相关部分:

 string_or_io.respond_to?(:encoding)
   unless string_or_io.encoding.name == "ASCII-8BIT"
      encoding ||= string_or_io.encoding.name
   end
 end

注意 string_or_io.encoding.name ,这与您看到的错误相匹配,未定义的方法'name'代表“UTF-8”:字符串(NoMethodError)

您的search_results对象是否具有键值对{:encoding =&gt;的属性? 'UTF-8'}?似乎Nokogiri正在寻找存储对象的编码,该对象的名称属性为'UTF-8'。