Ошибка регулярного выражения - (несовместимое совпадение регулярного выражения кодировки (регулярное выражение UTF-8 со строкой ASCII-8BIT) - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь сделать что-то, что кажется очень простым. Я пытаюсь проверить, найдена ли в исходном коде страницы конкретная строка c, например «нет в наличии». Однако меня не волнует, содержится ли строка в комментарии html или javascript. Поэтому, прежде чем приступить к поиску, я хотел бы удалить оба этих элемента с помощью регулярных выражений. Это код, который я использую.

urls.each do |url|
  response = HTTP.get(url)
     if response.status.success?
        source_code = response.to_s
        # Remove comments
        source_code = source_code.gsub(/<!--(.*?)-->/su, '')
        # Remove scripts
        source_code = source_code.gsub(/<script(.*?)<\/script>/msu, '')

        if source_code.match(/out of stock/i)
           # Flag URL for further processing
        end
     end
  end
end

Это работает для 99% всех URL-адресов, с которыми я его пробовал, но некоторые URL-адреса стали проблемными c. Когда я пытаюсь использовать эти регулярные выражения в исходном коде, возвращаемом для URL-адреса «https://www.sunski.com», я получаю следующее сообщение об ошибке:

Encoding::CompatibilityError (incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string))

Страница определенно UTF-8 закодировано, поэтому я не совсем понимаю сообщение об ошибке. Несколько человек по переполнению стека рекомендовали использовать комментарий # encoding: UTF-8 в верхней части файла, но это не сработало.

Если бы кто-нибудь мог помочь с этим, это было бы очень признательно. Спасибо!

1 Ответ

2 голосов
/ 09 июля 2020

Стандартная библиотека Net::HTTP возвращает только двоичные (ASCII-8BIT) строки. См. Давний запрос функции: Feature # 2567: Net :: HTTP некорректно обрабатывает кодировку . Поэтому, если вам нужны строки UTF-8, вам нужно вручную установить их кодировку в UTF-8 с помощью String#force_encoding:

source_code.force_encoding(Encoding::UTF_8)

Если кодировка символов веб-сайта не UTF-8 вам необходимо реализовать heuristi c на основе заголовка Content-Type или атрибута <meta> charset, но даже тогда это может быть неправильная кодировка. Вы можете проверить кодировку строки с помощью String#valid_encoding?, если вам нужно иметь дело с такими случаями. К счастью, в настоящее время большинство веб-сайтов используют UTF-8.

Также, как @ WiktorStribiżew уже писал в комментариях, модификаторы кодировки regexp s (Windows -31J) и u (UTF-8) не используются В этом нет необходимости, да и очень редко. Особенно последний, поскольку современный Ruby по умолчанию использует UTF-8 (или, если достаточно, его подмножество US-ASCII) в любом случае. В других языках программирования они могут иметь другое значение, например, в Perl s означает однострочный .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...