Я использую 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 для анализа этого HTML-ответа, я сделаю:
nokogiri_obj = Nokogiri::HTML(body)
Но если я хочу использовать гем Mechanize, мне нужно сделать следующее:
agent = Mechanize.new
mechanize_obj = agent.get("http://www.example.com")
Могу ли я использовать Net::Http для получения ответа HTML, а затем использовать гем Mechanize для преобразования его в объект 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)
когда я использую метод parse
для Net::HTTP
, он отлично работает, и я получаю объект 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)
Я передаю неправильные аргументы для метода parse
при использовании em-http?
get
за вас. Mechanize также использует Nokogiri для внутреннего синтаксического анализа, поэтому можно запросить проанализированный документ Nokogiri для выполнения дополнительных поисков. - person the Tin Man   schedule 21.08.2012