| 27 января 2009, 17:32 | |
|---|---|
painEffect Живет: не указан Сообщений: 6 Рейтинг: 0.0 Рег: 27 янв. 2009 |
Mechanize и сайт на русском |
| Здравствуйте. В ходе работы мне потребовалось выдирать информацию из сторонних сайтов. Для этого был выбран mechanize. Но при выдаче текста с сайта в кодировке cp1251 получаю кракозябры (такие как если открыть страницу в cp1251 а в браузере выстовить кодировку western). Попробовал работать с сайтом у которого кодировка utf8. Часть страниц парсится нормально, на других вместо текста снова кракозябры (но такие как если страницу в utf8 открыть с кодировкой western). Отсюда у меня вопрос - есть ли опыт успешного взаимодействия mechanize с русскоязычными сайтами? И если да - то поделитесь пожалуйста опытом. / система debian, локаль по-умолчанию ru_RU.utf8 / | |
| ruby, mechanize |
| 27 января 2009, 21:48 | |
|---|---|
Ruslan Voloshin Живет: Odessa,UKR Сообщений: 2156 Рейтинг: 532.0 Рег: 13 марта 2007 Его блог |
RE: Mechanize и сайт на русском |
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 консультации |
|
| mechanize, Page |
| 28 января 2009, 13:39 | |
|---|---|
painEffect Живет: не указан Сообщений: 6 Рейтинг: 0.0 Рег: 27 янв. 2009 |
RE: Mechanize и сайт на русском |
Итак, внимание, правильный ответ:
Переопределяем метод 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 можно указать любую другую правильную кодировку страницы. |
|
| mechanize |
| 28 января 2009, 14:36 | |
|---|---|
Александр Рельсовик Живет: Киев Сообщений: 72 Рейтинг: 0.0 Рег: 26 мая 2008 Его блог |
RE: Mechanize и сайт на русском |
| Спасибо за ответ.:-) | |
| 28 января 2009, 15:58 | |
|---|---|
Ruslan Voloshin Живет: Odessa,UKR Сообщений: 2156 Рейтинг: 532.0 Рег: 13 марта 2007 Его блог |
RE: RE: Mechanize и сайт на русском |
| А как на счет определения кодировки по хедеру и конвертации контента в UTF8 ------------ Операции с WM | SEO консультации |
|
| utf8 |
| 28 января 2009, 16:55 | |
|---|---|
painEffect Живет: не указан Сообщений: 6 Рейтинг: 0.0 Рег: 27 янв. 2009 |
RE: RE: RE: Mechanize и сайт на русском |
| Можно и по хедеру. Мне пока достаточно определять вручную. Конвертация в utf-8 производится автоматически. А вот кодировка самостоятельно определяется редко. И видимо по-умолчанию выставляется как iso-8859-1. Поэтому, даже в случае указанной в хедере utf-8, может произойти конвертация текста из iso-8859-1 в utf-8. Отсюда и кракозябры. | |
| mechanize, utf-8 |
| 31 января 2009, 00:26 | |
|---|---|
painEffect Живет: не указан Сообщений: 6 Рейтинг: 0.0 Рег: 27 янв. 2009 |
RE: Mechanize и сайт на русском |
И еще по теме использования 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
}
А именно, устанавливаем максимальную глубину истории посещенных страниц равной единице.
Спасибо за внимание. |
|
| mechanize, memory leak |
| 31 января 2009, 00:49 | |
|---|---|
Ruslan Voloshin Живет: Odessa,UKR Сообщений: 2156 Рейтинг: 532.0 Рег: 13 марта 2007 Его блог |
RE: RE: Mechanize и сайт на русском |
| Можешь кинуть кусок кода в котором скажем скрипт будет лезть на 0 1 2 уровень тоесть от первой страницы еще два клика. ------------ Операции с WM | SEO консультации |
|
| 31 января 2009, 23:34 | |
|---|---|
painEffect Живет: не указан Сообщений: 6 Рейтинг: 0.0 Рег: 27 янв. 2009 |
RE: RE: RE: Mechanize и сайт на русском |
Я в замешательстве, не могу понять зачем это нужно?
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
|
|
| mechanize |
| 04 мая 2009, 17:22 | |
|---|---|
Данил Негриенко Живет: Украина, Донецк Сообщений: 3 Рейтинг: 0.0 Рег: 04 мая 2009 |
RE: Mechanize и сайт на русском |
| 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, 17:32 | |
|---|---|
gleb_erof Живет: не указан Сообщений: 1 Рейтинг: 0.0 Рег: 07 февр. 2010 |
RE: Mechanize и сайт на русском |
| painEffect В общем проблема таже, parse сайтов в разных кодировках koi, cp, utf. Только с utf работает нормально. Переписывание класса (сделал в lib отд. файлик) как предложено ув. PainEffect - вопрос не решило. Если читаю не UTF сайт - получаю козябли на выходе. Что же я делаю не так? | |