Нокогири и механизировать проблему - PullRequest
1 голос
/ 04 марта 2011

Я делаю один из примеров на сайте механизированной документации и хочу проанализировать результаты, используя nokogiri.

Моя проблема в том, что при выполнении следующей строки:

doc = Nokogiri::HTML(search_results, 'UTF-8' )

возникает следующая ошибка:

C:/Ruby192/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4.1-x86-mingw32/lib/nokogiri/html/document.rb:71:in `parse': undefined method `name' for "UTF-8":String (NoMethodError)
    from C:/Ruby192/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4.1-x86-mingw32/lib/nokogiri/html.rb:13:in `HTML'
    from mechanize_test.rb:16:in `<main>'

Я установил ruby ​​1.9 на машине с Windows Vista

Результаты, возвращаемые механизмом, являются нелатинскими (utf8)

Пример кода приведен ниже.

# encoding: UTF-8

 require 'rubygems'
 require 'mechanize'
 require 'nokogiri'

 agent = Mechanize.new
 agent.user_agent_alias = 'Mac Safari'
 page = agent.get("http://www.google.com/")
 search_form = page.form_with(:name => "f")
 search_form.field_with(:name => "q").value = "invitations"
 search_results = agent.submit(search_form)
 puts search_results.body

 doc = Nokogiri::HTML(search_results, 'UTF-8')

Ответы [ 2 ]

5 голосов
/ 09 марта 2011

@ Дуглас Друйяр

Спасибо, что заглянул в это. Я узнал, что сделал ошибку. Призыв к Нокогири должен был быть:

doc = Nokogiri::HTML(search_results.body, 'UTF-8')

Обратите внимание, что search_results отличается от search_results.body.

Search_results содержит информацию, поступающую прямо из механизма механизации в то время как search_resuls.body содержит html utf8 информацию, которую nokogiri может проанализировать без проблем.

2 голосов
/ 07 марта 2011

Похоже, это проблема с тем, что Нокогири ожидает в качестве параметров вызываемого метода синтаксического анализа. Первая проблема, которую я вижу, заключается в том, что вы передаете опцию кодирования в неправильный слот параметра,

A пример анализа со страницы проекта Nokogiri, в котором указана кодировка

Nokogiri.XML('<foo><bar /><foo>', nil, 'EUC-JP')

Обратите внимание, что кодировка является третьим параметром, а не вторым. Но это все еще не полностью объясняет поведение, которое вы видите, поскольку кодировка должна просто игнорироваться.

Согласно документации Nokogiri, вызов Nokogiri :: HTML () - это удобный метод для метода разбора.

Код для Nokogiri :: HTML :: parse

   def parse thing, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_HTML, &block
      document.parse(thing, url, encoding, options, &block)
   end

Источник для метода синтаксического анализа Nokogiri :: HTML :: Document немного длинный, но здесь есть важная часть:

 string_or_io.respond_to?(:encoding)
   unless string_or_io.encoding.name == "ASCII-8BIT"
      encoding ||= string_or_io.encoding.name
   end
 end

Обратите внимание string_or_io.encoding.name , соответствует ошибке вашей пилы, неопределенное имя метода для "UTF-8": String (NoMethodError) .

Имеет ли ваш объект search_results атрибут с парой значений ключей {: encoding => 'UTF-8'}? Похоже, что Нокогири ищет кодировку для хранения объекта, который затем имеет атрибут имени «UTF-8».

...