Ruby On Rails in UA/Ruby 1.8, 1,9/Mechanize и сайт на русском

27 января 2009, 19:32   Mechanize и сайт на русском
painEffect
painEffect
Живет: не указан
Сообщений: 7
Рейтинг: 0.0
Рег: 27 янв. 2009

  •  
Здравствуйте. В ходе работы мне потребовалось выдирать информацию из сторонних сайтов. Для этого был выбран mechanize. Но при выдаче текста с сайта в кодировке cp1251 получаю кракозябры (такие как если открыть страницу в cp1251 а в браузере выстовить кодировку western). Попробовал работать с сайтом у которого кодировка utf8. Часть страниц парсится нормально, на других вместо текста снова кракозябры (но такие как если страницу в utf8 открыть с кодировкой western). Отсюда у меня вопрос - есть ли опыт успешного взаимодействия mechanize с русскоязычными сайтами? И если да - то поделитесь пожалуйста опытом. / система debian, локаль по-умолчанию ru_RU.utf8 /
27 января 2009, 23:48   RE: Mechanize и сайт на русском
admin
Ruslan Voloshin
Живет: Odessa,UKR
Сообщений: 2441
Рейтинг: 616.0
Рег: 13 марта 2007
Его блог
  •  
require 'rubygems' require 'mechanize' require 'rubyful_soup' class SoupParser < WWW::Mechanize::Page attr_reader :soup def initialize(uri = nil, response = nil, body = nil, code = nil) @soup = BeautifulSoup.new(body) super(uri, response, body, code) end def convert # 1)read header charset # 2) convert to utf8 end end
Операции с WM | SEO консультации
28 января 2009, 15:39   RE: Mechanize и сайт на русском
painEffect
painEffect
Живет: не указан
Сообщений: 7
Рейтинг: 0.0
Рег: 27 янв. 2009

  •  
Итак, внимание, правильный ответ: Переопределяем метод parser у себя в коде class WWW::Mechanize::Page def parser return @parser if @parser if body && response html_body = body.length > 0 ? body : '' @parser = WWW::Mechanize.html_parser.parse(html_body, nil, 'utf-8') end @parser end end Вместо utf-8 можно указать любую другую правильную кодировку страницы.
28 января 2009, 16:36   RE: Mechanize и сайт на русском
sfinx
Александр Рельсовик
Живет: Киев
Сообщений: 72
Рейтинг: 0.0
Рег: 26 мая 2008
Его блог
  •  
Спасибо за ответ.:-)
28 января 2009, 17:58   RE: RE: Mechanize и сайт на русском
admin
Ruslan Voloshin
Живет: Odessa,UKR
Сообщений: 2441
Рейтинг: 616.0
Рег: 13 марта 2007
Его блог
  •  
А как на счет определения кодировки по хедеру и конвертации контента в UTF8
Операции с WM | SEO консультации
28 января 2009, 18:55   RE: RE: RE: Mechanize и сайт на русском
painEffect
painEffect
Живет: не указан
Сообщений: 7
Рейтинг: 0.0
Рег: 27 янв. 2009

  •  
Можно и по хедеру. Мне пока достаточно определять вручную. Конвертация в utf-8 производится автоматически. А вот кодировка самостоятельно определяется редко. И видимо по-умолчанию выставляется как iso-8859-1. Поэтому, даже в случае указанной в хедере utf-8, может произойти конвертация текста из iso-8859-1 в utf-8. Отсюда и кракозябры.
31 января 2009, 02:26   RE: Mechanize и сайт на русском
painEffect
painEffect
Живет: не указан
Сообщений: 7
Рейтинг: 0.0
Рег: 27 янв. 2009

  •  
И еще по теме использования mechanize. При продолжительном хождении по страницам скрипт становится прожорливым в плане потребления памяти. Где-то за час он у меня умудрился употребить порядка гигабайта. Это связано с ничем не ограниченной историей посещенных страниц. Подсказку я нашел тут: http://my.opera.com/dduenker/blog/2008/09/03/ruby-prevent-www-mechanize-from-stealing-your-memory Но если проследовать совету и поставить ограничение в ноль, то скрипт сразу же вылетает с ошибкой из-за невозможности сформировать поле referrer. Поэтому вносим небольшую поправку: agent = WWW::Mechanize.new{ |agent| agent.history.max_size = 1 } А именно, устанавливаем максимальную глубину истории посещенных страниц равной единице. Спасибо за внимание.
31 января 2009, 02:49   RE: RE: Mechanize и сайт на русском
admin
Ruslan Voloshin
Живет: Odessa,UKR
Сообщений: 2441
Рейтинг: 616.0
Рег: 13 марта 2007
Его блог
  •  
Можешь кинуть кусок кода в котором скажем скрипт будет лезть на 0 1 2 уровень тоесть от первой страницы еще два клика.
Операции с WM | SEO консультации
01 февраля 2009, 01:34   RE: RE: RE: Mechanize и сайт на русском
painEffect
painEffect
Живет: не указан
Сообщений: 7
Рейтинг: 0.0
Рег: 27 янв. 2009

  •  
Я в замешательстве, не могу понять зачем это нужно? get("http://www.....") do |main_page| main_page.search('//span[@class="rub"]/a').each do |lnk| category_page = click lnk #... куча не интересного кода category_page.search('//div[@class="opus"]/a[@target="_blank"]').each do |cmp_lnk| info_page = click cmp_lnk #... -||- end #... -||- end end
04 мая 2009, 20:22   RE: Mechanize и сайт на русском
negrienko
Данил Негриенко
Живет: Украина, Донецк
Сообщений: 5
Рейтинг: 0.0
Рег: 04 мая 2009

  •  
painEffect У меня не работает. > Переопределяем метод parser у себя в коде > class WWW::Mechanize::Page > def parser > return @parser if @parser > > if body && response > html_body = body.length > 0 ? body : '' > @parser = WWW::Mechanize.html_parser.parse(html_body, nil, 'utf-8') > end > > @parser > end > end > Вместо utf-8 можно указать любую другую правильную кодировку страницы. Пишу так — WWW::Mechanize.html_parser.parse(html_body, 'windows-1251', 'utf-8') В базу ложится ÀÂÒÎÇÀÏÐÀÂÎ×ÍÛÅ ÑÒÀÍÖÈÈ, пробую с nil — тоже самое.
http://negrienko.com, http://gtd-today.com, http://rails.negrienko.com, http://idt.com.ua
07 февраля 2010, 19:32   RE: Mechanize и сайт на русском
gleb_erof
gleb_erof
Живет: не указан
Сообщений: 1
Рейтинг: 0.0
Рег: 07 февр. 2010

  •  
painEffect В общем проблема таже, parse сайтов в разных кодировках koi, cp, utf. Только с utf работает нормально. Переписывание класса (сделал в lib отд. файлик) как предложено ув. PainEffect - вопрос не решило. Если читаю не UTF сайт - получаю козябли на выходе. Что же я делаю не так?