Ruby извлекает ссылки из html - PullRequest
1 голос
/ 26 марта 2012

Здравствуйте, вот мой сценарий:

ARGV.each do |input_filename|
  doc = Nokogiri::HTML(File.read(input_filename))
  title, body = doc.title.gsub("/\s+/"," ").downcase.strip, doc.xpath('//body').inner_text.tr('"', '').gsub("\n", '').downcase.strip
  link = doc.search("a[@href]") //Adding this part generates errors
  filename = File.basename(input_filename, ".*")
  puts %Q("#{title}", "#{body}", "#{filename}", "#{link}").downcase
end

У меня проблемы с извлечением ссылок из списка html-файлов. Я считаю, что проблема связана с нетрадиционным кодированием в некоторых HTML-файлах. Вот ошибка, которую я получаю.

extractor.rb:9:in `block in <main>': incompatible character encodings: UTF-8 and  CP850 (Encoding::CompatibilityError)
        from extractor.rb:4:in `each'
        from extractor.rb:4:in `<main>'

Ответы [ 2 ]

4 голосов
/ 26 марта 2012

Вы можете сделать это другим способом , используя селектор CSS:

doc.css('a').map { |link| link['href'] }

Это будет искать в документе все якоря и возвращать их href-текст в массиве.

1 голос
/ 27 марта 2012

Nokogiri хранит Strings всегда как UTF-8 внутри. Методы, которые возвращают текстовые значения, всегда будут возвращать строки в кодировке UTF-8.

У вас конфликт UTF-8 и cp850 (вы работаете с Windows?). Вы можете адаптировать свой File.read(input_filename)

Попробуйте

File.read(input_filename, :encoding => 'cp850:utf-8') 

Если ваши html-файлы являются файлами Windows.

Если ваши html-файлы уже имеют формат utf-8, попробуйте:

File.read(input_filename, :encoding => 'utf-8') 

Другим решением может быть Encoding.default_external = 'utf-8' в начале вашего кода. (Я бы не советовал, используйте его только для небольших скриптов).

...