Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby: Общие вопросы > nokogiri кириллица


Автор: RoRka 12.2.2010, 11:34
Немного модифицированный пример с сайта Nokogiri: 

Код

require 'rubygems'
require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open('http://www.google.com.ua/search?q=ruby'))

doc.css('h3.r a.l').each do |link|
  puts link.content
end


Возникли проблемы с кириллицей. Помогите разобраться в чем дело. 

Код

doc = Nokogiri::HTML(open('http://www.google.com.ua/search?q=ruby'), nil, 'UTF-8')
 не помогает. 

Автор: bilbobagginz 12.2.2010, 12:05
Цитата(RoRka @  12.2.2010,  10:34 Найти цитируемый пост)
Возникли проблемы с кириллицей.

а в чем именно - проблемы ?


Автор: RoRka 12.2.2010, 12:57
Некорректно отображается:
Код

Ruby Programming Language
Download Ruby
Ruby — ³ê³ïåä³ÿ
Ruby on Rails — ³ê³ïåä³ÿ
Ruby — Âèêèïåäèÿ
Ruby — Âèêèó÷åáíèê
Ruby On Rails in UA
HostPro (ÕîñòÏðî) - Õîñòèíã: Ruby-on-Rails
Ðåçþìå PHP, Ruby on rails developer | Ðåçþìå â Êèåâå
Ruby on Rails


Скорей всего гугл отдает не в UTF-8. Так как с другими сайтами проблем нет.
Как тогда определить кодировку?

Автор: bilbobagginz 12.2.2010, 15:54
RoRka
дело в том, что проблема может быть в 3-х местах:
  • самой программе (т.е. ты получаешь данные в неправильной кодировке)
  • локали (системной или пользовательской)
  • настройках программы эмулюции терминала
если у пользователя не указана локаль - используется системная.
если ты хочешь, чтобы все было в UTF-8, то проверь, что
  • пользовательская локаль установлена на UTF-8
  • локаль терминала тоже - UTF-8, и шрифт терминала поддерживает эту кодировку.
опиши как ты запускаешь программу, какая ОС, и т.д.

ну и ессно, ты же зависишь от способностей удаленных серверов, 
если удаленный сервер не умеет слать в UTF-8, 
то твои "кувырки" ничем не помогут.

ты можешь кстати попробовать определить кодировку автоматически.
я думаю через диапазоны кодировок (определись какие кодировки ты поддерживаешь, и перекодируй все в юникод).
самое сложное - определить точно в какой ты кодировке, а потом есть iconv

Автор: RoRka 12.2.2010, 20:56
Похоже проблема все же в сервере. Локаль настроена в UTF-8. Да и с другими сайтами таких проблем нет. 
Пример. На следующий код:
Код

require 'rubygems'
require 'nokogiri'
require 'open-uri'

  puts "----- GOOGLE ------"
  doc = Nokogiri::HTML(open('http://www.google.com.ua/search?q=ruby'))
  doc.css('h3.r a.l').each do |link|
    puts link.content
  end

  puts "------ YANDEX ------"
  doc = Nokogiri::HTML(open('http://yandex.ua/yandsearch?p=&text=ruby&lr=145'))
  doc.css('a.cs').each do |link|
    puts link.content
  end

Такой вот результат:
Код

----- GOOGLE ------
Ruby Programming Language
Download Ruby
Ruby — ³ê³ïåä³ÿ
Ruby on Rails — ³ê³ïåä³ÿ
Ruby — Âèêèïåäèÿ
Ruby — Âèêèó÷åáíèê
Ruby On Rails in UA
HostPro (ÕîñòÏðî) - Õîñòèíã: Ruby-on-Rails
Ruby on Rails
Ruby (programming language) - Wikipedia, the free encyclopedia
------ YANDEX ------
Ruby — Википедия 
Ruby Programming Language 
Ruby on Rails - Веб-разработка с удовольствием 
Ruby — Викиучебник 
Ruby On Rails in UA 
[Ruby-Doc.org: Documenting the Ruby Language] 
Язык программирования Ruby 
Forum List - Ruby Forum 
Ruby on Rails 
ruby.su 


Интересно, что с Mechanize таких проблем не возникает:
Код

require 'rubygems'
require 'mechanize'
  class GooglePars < Mechanize
    def process
        get 'http://www.google.com.ua/search?q=ruby'
        page.links.each do |link|
           if link.attributes['class'] == "l"
               puts "#{link.text}"
           end
        end
   end
 end
GooglePars.new.process

Результат:
Код

Ruby Programming Language
Download Ruby
Ruby — Вікіпедія
Ruby on Rails — Вікіпедія
Ruby — Википедия
Ruby — Викиучебник
Ruby On Rails in UA
HostPro (ХостПро) - Хостинг: Ruby-on-Rails
Ruby on Rails
Ruby (programming language) - Wikipedia, the free encyclopedia

Автор: bilbobagginz 13.2.2010, 08:56
попробуй кодировку вставить в стринг запроса у гугла,
(так по крайней мере мой браузер делает):
Код

  puts "----- GOOGLE ------"
  doc = Nokogiri::HTML(open('http://www.google.com.ua/search?q=ruby&ie=UTF-8'))
  doc.css('h3.r a.l').each do |link|
    puts link.content
  end

ты же делаешь запрос в украинский филиал.
На сервере гугл в Украине стоит какая-то украинская кодировка "по умолчанию",
что вполне логично.

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



Автор: Fortop 13.2.2010, 10:20
Цитата(bilbobagginz @  13.2.2010,  07:56 Найти цитируемый пост)
На сервере гугл в Украине стоит какая-то украинская кодировка "по умолчанию",
что вполне логично.

Не логично ни разу

http://www.google.com.ua/#q=ruby&fp=1
Все в UTF возвращается.

Пусть посмотрит User-Agent, который передается в запросах.

Автор: bilbobagginz 13.2.2010, 14:08
Fortop, user-agent это правильно...там ведь тоже кодировка есть.

Автор: Fortop 13.2.2010, 15:44
bilbobagginz, я бы и рад тебя обрадовать, да нечем - нет там кодировки.
Скорее всего он просто определяет по браузеру как отдавать.

Код

GET /search?q=ruby&fp=1&cad=b HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/msword, */*
Referer: http://www.google.com.ua/
Accept-Language: uk-UA
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; MRSPUTNIK 2, 2, 0, 164; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
Accept-Encoding: gzip, deflate
Host: www.google.com.ua
Connection: Keep-Alive

Автор: bilbobagginz 13.2.2010, 21:34
Fortop, ну я не знаю, пускай RoRka расскажет сам что он там накопал, и помогает ли ему в запросе просить кодировку....

Автор: RoRka 14.2.2010, 10:37
Такой вот код не помог:
Код

require 'rubygems'
require 'nokogiri'
require 'open-uri'

HEADERS = {
    'Host'            => 'www.google.com.ua',
    'User-Agent'      => 'Mozilla/5.0 (X11; U; Linux i686; ru; rb:1.9.2) Firefox/3.0.6',
    'Accept'          => 'text/html,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language' => 'uk-UA',
    'Accept-Charset'  => 'utf-8',
    'Keep-Alive'      => '300',
    'Connection'      => 'keep-alive',
    'Cache-Control'   => 'max-age=0'
}

  puts "----- GOOGLE ------"
  doc = Nokogiri::HTML(open('http://www.google.com.ua/search?q=ruby&ie=UTF-8', HEADERS))         
  doc.css('h3.r a.l').each do |link|
    puts link.content
  end


Но вариант с Mechanize мне очень даже подходит, поэтому в дальнейших "плясках" смысла не вижу. Спасибо, что пытались помочь.

Автор: bilbobagginz 15.2.2010, 09:53
RoRka, где-то я видел, что можно было сделать force_encoding = 'utf-8'
но если ты нашел другое решение - флаг тебе в ласты smile

Автор: niksan 4.5.2010, 14:44
я через Iconv делал у себя

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)