3

HTTPリクエストにNet::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

このHTML応答を解析するために、Nokogiri gemを使用する必要がある場合は、次のようにします。

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)

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)     

parseem-httpを使用して いるときに、メソッドに間違った引数を渡していませんか?

4

2 に答える 2

3

Net::HTTPを使用する方が良いと思う理由がわかりません。MechanizeはリダイレクトとCookieを処理し、さらにNokogiriの解析されたドキュメントへの容易なアクセスを提供します。

require 'mechanize'

agent = Mechanize.new
page = agent.get('http://www.example.com')

# Use Nokogiri to find the content of the <h1> tag...
puts page.at('h1').content # => "Example Domains"

user_agentexample.comにアクセスするためにを設定する必要はないことに注意してください。


スレッドエンジンを使用してページを取得する場合は、TyphoeousとHydraを参照してください。

于 2012-08-21T06:24:49.187 に答える
1

メソッドMechanizeがあるように見えるので、これは機能する可能性があります:parse

mechanize_obj = Mechanize.parse(uri, response, body)
于 2012-08-21T01:20:08.710 に答える