Обратите внимание, что Mechanize больше не использует Hpricot (он использует Nokogiri) по умолчанию в более поздних версиях (0.9.0), и вы должны явно указать Hpricot, чтобы продолжить использовать с:
WWW::Mechanize.html_parser = Hpricot
Точно так же, без кавычек или чего-то другого в Hpricot - возможно, есть модуль, который вы можете указать для Hpricot, потому что он не будет работать, если вы поместите этот оператор в собственное объявление модуля. Вот лучший способ сделать это на вершине своего класса (до открытия модуля или класса)
require 'mechanize'
require 'hpricot'
# Later versions of Mechanize no longer use Hpricot by default
# but have an attribute we can set to use it
begin
WWW::Mechanize.html_parser = Hpricot
rescue NoMethodError
# must be using an older version of Mechanize that doesn't
# have the html_parser attribute - just ignore it since
# this older version will use Hpricot anyway
end
Используя спасательный блок, вы гарантируете, что, если у них есть более старая версия механизации, он не помешает несуществующему атрибуту html_parser. (В противном случае вам нужно сделать свой код зависимым от последней версии Mechanize)
Также в последней версии WWW :: Mechanize :: List устарел. Не спрашивайте меня почему, потому что это полностью нарушает обратную совместимость для операторов типа
page.forms.name('form1').first
, который раньше был обычной идиомой, которая работала, потому что формы Page # возвращали механизированный List, у которого был метод "name". Теперь он возвращает простой массив форм.
Я нашел это сложным путем, но ваше использование будет работать, потому что вы используете find
, который является методом массива.
Но лучший способ найти первую форму с заданным именем - Page#form
, поэтому ваша строка для поиска формы станет
form = page.form('form1')
этот метод работает со старыми и новыми версиями.