我在机械化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')
答案 0 :(得分:5)
@Douglas Drouillard
Thanx对此进行调查。我发现我犯了一个错误。对nokogiri的呼吁应该是:
doc = Nokogiri::HTML(search_results.body, 'UTF-8')
请注意,search_results
与search_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'。