Как заставить Mechanize автоматически конвертировать тело в UTF8? - PullRequest
4 голосов
/ 14 января 2012

Я нашел некоторые решения, использующие post_connect_hook и pre_connect_hook, но кажется, что они не работают. Я использую последнюю версию Mechanize (2.1). В новой версии нет полей [:response], и я не знаю, где их взять в новой версии.

Можно ли заставить Mechanize возвращать версию в кодировке UTF8, вместо того, чтобы преобразовывать ее вручную, используя iconv?

Ответы [ 4 ]

3 голосов
/ 16 октября 2012

Начиная с Механизации 2.0, аргументы pre_connect_hooks() и post_connect_hooks() были изменены.

См. Документацию Механизация :

pre_connect_hooks ()

Список хуков, которые нужно вызвать перед получением ответа.Хуки вызываются с агентом, URI, ответом и телом ответа.

post_connect_hooks ()

Список хуков дляпозвонить после получения ответа.Хуки вызываются с агентом, URI, ответом и телом ответа.

Теперь вы не можете изменить внутреннее значение тела ответа, поскольку аргумент не является массивом.Итак, следующий лучший способ - заменить внутренний синтаксический анализатор своим:

class MyParser
  def self.parse(thing, url = nil, encoding = nil, options = Nokogiri::XML::ParseOptions::DEFAULT_HTML, &block)
    # insert your conversion code here. For example:
    # thing = NKF.nkf("-wm0X", thing).sub(/Shift_JIS/,"utf-8") # you need to rewrite content charset if it exists.
    Nokogiri::HTML::Document.parse(thing, url, encoding, options, &block)
  end
end

agent = Mechanize.new
agent.html_parser = MyParser
page = agent.get('http://somewhere.com/')
...
2 голосов
/ 18 декабря 2013

Я нашел решение, которое работает довольно хорошо:

class HtmlParser
  def self.parse(body, url, encoding)
    body.encode!('UTF-8', encoding, invalid: :replace, undef: :replace, replace: '')
    Nokogiri::HTML::Document.parse(body, url, 'UTF-8')
  end
end

Mechanize.new.tap do |web|
  web.html_parser = HtmlParser
end

Проблем пока не найдено.

0 голосов
/ 11 июля 2013

В вашем скрипте просто введите: page.encoding = 'utf-8'

Однако, в зависимости от вашего сценария, вместо этого вам может понадобиться ввести обратное (кодировка веб-сайта, с которым работает Mechanize). Для этого откройте Firefox, откройте веб-сайт, с которым хотите работать Mechanize, выберите «Инструменты» в меню и затем откройте «Информация о странице». Определите, что страница закодирована оттуда.

Используя эту информацию, вы вместо этого введете кодировку страницы (например, page.encoding = 'windows-1252').

0 голосов
/ 21 января 2012

Как насчет этого:

class Mechanize
    alias_method :original_get, :get
    def get *args
        doc = original_get *args
        doc.encoding = 'utf-8'
        doc
    end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...