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