Пользовался nokogiri.
Попадались страницы со странными кодировками. Прогонял текст через такую функцию:
//проверяет в какой кодировке текст и возвращает utf-8
public static function getUTF8($text) {
$UTF32_BIG_ENDIAN_BOM = chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF);
$UTF32_LITTLE_ENDIAN_BOM = chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00);
$UTF16_BIG_ENDIAN_BOM = chr(0xFE) . chr(0xFF);
$UTF16_LITTLE_ENDIAN_BOM = chr(0xFF) . chr(0xFE);
$UTF8_BOM = chr(0xEF) . chr(0xBB) . chr(0xBF);
$first2 = substr($text, 0, 2);
$first3 = substr($text, 0, 3);
$first4 = substr($text, 0, 3);
$encoding = null;
if ($first3 == $UTF8_BOM) $encoding = 'UTF-8';
else if ($first4 == $UTF32_BIG_ENDIAN_BOM) $encoding = 'UTF-32BE';
else if ($first4 == $UTF32_LITTLE_ENDIAN_BOM) $encoding = 'UTF-32LE';
else if ($first2 == $UTF16_BIG_ENDIAN_BOM) $encoding = 'UTF-16BE';
else if ($first2 == $UTF16_LITTLE_ENDIAN_BOM) $encoding = 'UTF-16LE';
if($encoding)
return mb_convert_encoding($text, 'UTF-8', $encoding);
return $text;
}