【发布时间】:2012-08-16 08:10:18
【问题描述】:
我正在使用 Net::HTTP 处理 HTTP 请求并得到响应:
uri = URI("http://www.example.com")
http = Net::HTTP.start(uri.host, uri.port, proxy_host, proxy_port)
request = Net::HTTP::Get.new uri.request_uri
response = http.request request # Net::HTTPResponse object
body = response.body
如果我必须使用 Nokogiri gem 来解析这个 HTML 响应,我会这样做:
nokogiri_obj = Nokogiri::HTML(body)
但如果我想使用 Mechanize gem,我需要这样做:
agent = Mechanize.new
mechanize_obj = agent.get("http://www.example.com")
我是否可以使用 Net::Http 获取 HTML 响应,然后使用 Mechanize gem 将其转换为 Mechanize 对象,而不是使用 agent.get()?
编辑:
绕过agent.get() 方法的原因是因为我试图使用EventMachine::Iterator 来发出并发EM-HTTP 请求。
EventMachine.run do
EM::Iterator.new(urls, 3).each do |url,iter|
puts "giving #{url} to httprequest now"
http = EM::HttpRequest.new(url).get
http.callback { |resp|
uri = resp.send(:URI, url)
puts "inside callback of #{url}"
body = resp.response
page = agent.parse(uri, resp, body)
}
iter.next
end
end
但它不起作用。我收到一个错误:
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/mechanize-2.5.1/lib/mechanize.rb:1165:in`parse': undefined method `[]' for #<EventMachine::HttpClient:0x0000001c18eb30> (NoMethodError)
当我对Net::HTTP 使用parse 方法时,它工作正常,我得到了 Mechanize 对象:
uri = URI("http://www.example.com")
http = Net::HTTP.start(uri.host, uri.port, proxy_host, proxy_port)
request = Net::HTTP::Get.new uri.request_uri
response = http.request request # Net::HTTPResponse object
body = response.body
agent = Mechanize.new
page = agent.parse(uri, response, body)
我在使用 em-http 时是否为 parse 方法传递了错误的参数?
【问题讨论】:
-
您为什么要这样做? agent.get 要简单得多。
-
你做的工作太多了。 Mechanize 将为您处理
get。 Mechanize 还在内部使用 Nokogiri 进行解析,因此可以请求 Nokogiri 解析的文档让您进行额外的查找。 -
我已经编辑了这个问题..谢谢
标签: ruby nokogiri mechanize eventmachine net-http