Как преобразовать объект Mechanize::File в объект Mechanize::Page?

У меня есть страница, которая входит в форму. После входа в систему есть несколько редиректов. Первый выглядит так:

#<Mechanize::File:0x1f4ff23 @filename="MYL.html", @code="200", @response={"cache-control"=>"no-cache=\"set-cookie\"", "content-length"=>"114", "set-cookie"=>"JSESSIONID=GdJnPVnhtN91KZfQPc3QzM1NLCyWDsnyvpGg8LL0Knnz3RgqxLFs!1803804592!-2134626567; path=/; secure, COOKIE_TEST=Aslyn; secure", "x-powered-by"=>"Servlet/2.4 JSP/2.0"}, @body="\r\n<html>\r\n  <head>\r\n    <meta http-equiv=\"refresh\" content=\"0;URL=MYL?Select=OK&StateName=38\">\r\n  </head>\r\n</html>", @uri=#<URI::HTTPS:0x16e1eff URL:https://www.manageyourloans.com/MYL?StateName=global_CALMLandingPage&GUID=D1704621-1994-E076-460A-10B2B682B960>>

поэтому, когда я делаю здесь page.class, я получаю

Mechanize::File

Как преобразовать это в Mechanize::Page?


@pguardiario

Чтобы лучше объяснить, у меня есть код в моем исходном сообщении, который хранится на странице.

Когда я делаю page.class, я получаю Mechanize::File

Итак, я выполняю ваш код выше:

agent = Mechanize.new
agent.post_connect_hooks << lambda {|http| http[:response].content_type = 'text/html'}

Поэтому я делаю это: agent.get(page.uri.to_s) или событие try с любым URL-адресом agent.get("https://www.manageyourloans.com/MYL") Я получаю сообщение об ошибке: ArgumentError: неправильное количество аргументов (4 из 1)

Я даже пробовал это:

agent = Mechanize.new { |a|
  a.post_connect_hooks << lambda { |_,_,response,_|
    if response.content_type.nil? || response.content_type.empty?
      response.content_type = 'text/html'
    end
  }
}

Мой вопрос: как только я это сделаю, как мне преобразовать предыдущую страницу в Mechanize::Page?


person user1198316    schedule 23.04.2012    source источник


Ответы (2)


Вы можете преобразовать Mechanize::File в Mechanize::Page, взяв тело, содержащееся в файловом объекте, и передав его в качестве тела новой страницы:

irb(main):001:0> require 'mechanize'
true
irb(main):002:0> file = Mechanize::File.new(URI.parse('http://foo.com'),nil,File.read('foo.html'))
#<Mechanize::File:0x100ef0190
    @full_path = false,
    attr_accessor :body = "<html><body>foo</body></html>\n",
    attr_accessor :code = nil,
    attr_accessor :filename = "index.html",
    attr_accessor :response = {},
    attr_accessor :uri = #<URI::HTTP:0x100ef02d0
        attr_accessor :fragment = nil,
        attr_accessor :host = "foo.com",
        attr_accessor :opaque = nil,
        attr_accessor :password = nil,
        attr_accessor :path = "",
        attr_accessor :port = 80,
        attr_accessor :query = nil,
        attr_accessor :registry = nil,
        attr_accessor :scheme = "http",
        attr_accessor :user = nil,
        attr_reader :parser = nil
    >
>

Во-первых, я создал поддельный объект Mechanize::File только для того, чтобы использовать его в качестве кода примера. Вы можете увидеть содержимое прочитанного файла в папке :body.

Mechanize создает объект Mechanize::File, когда не может определить истинный тип содержимого.

irb(main):003:0> page = Mechanize::Page.new(URI.parse('http://foo.com'),nil,file.body)
#<Mechanize::Page:0x100ed5e30
    @full_path = false,
    @meta_content_type = nil,
    attr_accessor :body = "<html><body>foo</body></html>\n",
    attr_accessor :code = nil,
    attr_accessor :encoding = nil,
    attr_accessor :filename = "index.html",
    attr_accessor :mech = nil,
    attr_accessor :response = {
        "content-type" => "text/html"
    },
    attr_accessor :uri = #<URI::HTTP:0x100ed5ed0
        attr_accessor :fragment = nil,
        attr_accessor :host = "foo.com",
        attr_accessor :opaque = nil,
        attr_accessor :password = nil,
        attr_accessor :path = "",
        attr_accessor :port = 80,
        attr_accessor :query = nil,
        attr_accessor :registry = nil,
        attr_accessor :scheme = "http",
        attr_accessor :user = nil,
        attr_reader :parser = nil
    >,
    attr_reader :bases = nil,
    attr_reader :encodings = [
        [0] nil,
        [1] "US-ASCII"
    ],
    attr_reader :forms = nil,
    attr_reader :frames = nil,
    attr_reader :iframes = nil,
    attr_reader :labels = nil,
    attr_reader :labels_hash = nil,
    attr_reader :links = nil,
    attr_reader :meta_refresh = nil,
    attr_reader :parser = nil,
    attr_reader :title = nil
>
irb(main):004:0> page.class
Mechanize::Page < Mechanize::File

Просто передайте тело файлового объекта и позвольте Mechanize преобразовать его в то, что, как вы знаете, должно быть.

person the Tin Man    schedule 23.04.2012
comment
Я работаю над этим ответом и использую это: codepage = Mechanize::Page.new(URI.parse(page.uri.to_s),nil,page.body)code. Я получаю сообщение об ошибке: неопределенный метод `[]' для nil:NilClass - person user1198316; 24.04.2012

Мне нравится ответ @The Tin Man, но может быть проще указать тип содержимого ответа:

agent.post_connect_hooks << lambda {|http| http[:response].content_type = 'text/html'}
person pguardiario    schedule 24.04.2012
comment
Когда я делаю это в irb, я получаю: неопределенный метод `post_connect_hooks' для #‹Mechanize::File:0x15bab52› - person user1198316; 24.04.2012
comment
В моем ответе агент ссылается на объект Mechanize, который вы можете создать с помощью «Mechanize.new». - person pguardiario; 24.04.2012
comment
агент = Mechanize.new agent.post_connect_hooks ‹‹ лямбда {|http| http[:response].content_type = 'текст/html'}. Читая об этом, он говорит, что список хуков для вызова после получения ответа. Хуки вызываются агентом и возвращается ответ. Так что я бы сделал это после того, как у меня будет Mechanize::File, верно? Итак, если я затем выполню agent.get(urlofpagehere), должно ли это вернуть Mechanize::Page? - person user1198316; 24.04.2012
comment
Я не уверен, что понимаю, но если вы это сделаете, вы получите Mechanize::Page вместо Mechanize::File, да. - person pguardiario; 24.04.2012