Нокогири и механизировать проблему

Я делаю один из примеров на сайте механизированных документов, и я хочу проанализировать результаты, используя 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 ответа

Решение

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

Пример синтаксического анализа со страницы проекта 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".

@Douglas Drouillard

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

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

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

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

Другие вопросы по тегам