рубиновые 1.9: недопустимая последовательность байта в UTF-8

Я пишу поисковый робот в Ruby (1.9), который использует много HTML от большого количества случайных сайтов.
При попытке извлечь ссылки, я решил просто использовать .scan(/href="(.*?)"/i) вместо nokogiri/hpricot (главное ускорение). Проблема состоит в том, что я теперь получаю много из"invalid byte sequence in UTF-8"ошибки.
Из того, что я понял, net/http библиотека не имеет никаких кодирующих определенных опций и материала, который входит, в основном правильно не отмечен.
Каков был бы лучший способ на самом деле работать с теми входящими данными? Я попробовал .encode с заменой и недопустимым набором опций, но никаким успехом до сих пор...

109
задан user2333073 2 July 2013 в 11:05
поделиться

2 ответа

Я рекомендую вам использовать парсер HTML. Просто найдите самый быстрый.

Анализировать HTML не так просто, как может показаться.

Браузеры анализируют недопустимые последовательности UTF-8 в HTML-документах UTF-8, просто помещая символ «�». Итак, как только недопустимая последовательность UTF-8 в HTML будет проанализирована, результирующий текст станет допустимой строкой.

Даже внутри значений атрибутов вы должны декодировать объекты HTML, такие как amp

Вот отличный вопрос, который подводит итог, почему вы не можете надежно проанализировать HTML с помощью регулярного выражения: RegEx соответствует открытым тегам, кроме автономных тегов XHTML

4
ответ дан 24 November 2019 в 03:19
поделиться

Перед тем как использовать сканирование , убедитесь, что заголовок Content-Type запрашиваемой страницы имеет вид text / html , поскольку там могут быть ссылками на такие вещи, как изображения, которые не закодированы в UTF-8. Страница также может быть не HTML, если вы выбрали href в чем-то вроде элемента . Как это проверить, зависит от того, какую HTTP-библиотеку вы используете. Затем убедитесь, что результатом является только ascii с String # ascii_only? (не UTF-8, потому что HTML должен использовать только ascii, иначе можно использовать сущности). Если оба теста пройдены, можно безопасно использовать сканирование .

0
ответ дан 24 November 2019 в 03:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: