Я пишу поисковый робот в Ruby (1.9), который использует много HTML от большого количества случайных сайтов.
При попытке извлечь ссылки, я решил просто использовать .scan(/href="(.*?)"/i)
вместо nokogiri/hpricot (главное ускорение). Проблема состоит в том, что я теперь получаю много из"invalid byte sequence in UTF-8
"ошибки.
Из того, что я понял, net/http
библиотека не имеет никаких кодирующих определенных опций и материала, который входит, в основном правильно не отмечен.
Каков был бы лучший способ на самом деле работать с теми входящими данными? Я попробовал .encode
с заменой и недопустимым набором опций, но никаким успехом до сих пор...
Я рекомендую вам использовать парсер HTML. Просто найдите самый быстрый.
Анализировать HTML не так просто, как может показаться.
Браузеры анализируют недопустимые последовательности UTF-8 в HTML-документах UTF-8, просто помещая символ «�». Итак, как только недопустимая последовательность UTF-8 в HTML будет проанализирована, результирующий текст станет допустимой строкой.
Даже внутри значений атрибутов вы должны декодировать объекты HTML, такие как amp
Вот отличный вопрос, который подводит итог, почему вы не можете надежно проанализировать HTML с помощью регулярного выражения: RegEx соответствует открытым тегам, кроме автономных тегов XHTML
Перед тем как использовать сканирование
, убедитесь, что заголовок Content-Type
запрашиваемой страницы имеет вид text / html
, поскольку там могут быть ссылками на такие вещи, как изображения, которые не закодированы в UTF-8. Страница также может быть не HTML, если вы выбрали href
в чем-то вроде элемента
. Как это проверить, зависит от того, какую HTTP-библиотеку вы используете. Затем убедитесь, что результатом является только ascii с String # ascii_only?
(не UTF-8, потому что HTML должен использовать только ascii, иначе можно использовать сущности). Если оба теста пройдены, можно безопасно использовать сканирование
.