Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2016, 16:50   #1
ATF
 
Регистрация: 08.05.2016
Сообщений: 6
По умолчанию Как указать кодировку для парсинга?

Пишу для себя скрипт для анализа контента некоторых сайтов.
Вот кусочек скрипта:

PHP код:
$th2[$i] = $url // формирую массив с URL-ами
$ch curl_init();
curl_setopt($chCURLOPT_URL$url);
curl_setopt($chCURLOPT_RETURNTRANSFER,1); 
curl_setopt($chCURLOPT_FOLLOWLOCATION,1);         
curl_setopt($chCURLOPT_USERAGENT,"Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.0 YB/4.3.0");
            
$content[$i] = $this->Translit->htmlRemove(curl_exec($ch));
// Устанавливается порядок определения кодировки по указанному списку:
mb_detect_order("eucJP-win,sjis-win,UTF-8");
$codir[$i] = mb_detect_encoding($content[$i]);
if(
$codir[$i] != 'UTF-8'){ $content[$i] = iconv("cp1251","utf-8",$content[$i]); } 
Вот что имеем на выходе:

Перепробовал много чего, но вопросики так и не смог превратить в нормальный текст.
Докопался до того, что в header`e сайтов (в заголовках которые отдает сервер нет указания кодировки), с которых вместо текста парсятся вопросы нет указания кодировки.
Как я понимаю, curlу надо указать кодировку. А у этих проблемных сайтов кодировка указана в html коде - в метатегах. Но это для curlа уже бесполезно - он спарсил текст в виде вопросов. Подскажите как решить проблемку.

Я программист-любитель. Прошу не пинать сильно.
ATF вне форума Ответить с цитированием
Старый 28.05.2016, 17:17   #2
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

вы можете явно указать кодировку для данного сайта?

для примера - парсить отдельно сайты с одной кодировкой. потом по базе с другой кодировкой и т.д.

при желании в несколько потоков одновременно по разным базам.
Alar вне форума Ответить с цитированием
Старый 28.05.2016, 17:40   #3
ATF
 
Регистрация: 08.05.2016
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Alar Посмотреть сообщение
вы можете явно указать кодировку для данного сайта?

для примера - парсить отдельно сайты с одной кодировкой. потом по базе с другой кодировкой и т.д.

при желании в несколько потоков одновременно по разным базам.
Тут алгоритм немножко другой:
Сначала я получаю 10 урлов. И я не знаю какая кодировка у этих сайтов. И только в процессе парсинга оказывается, что некоторые сайты парсятся в виде вопросов.
В том-то и вопрос, что я могу проверить заголовок сервера - увидеть что там не указана кодировка. Тогда я могу проверить мета-теги и взять оттуда кодировку. Но тогда надо повторно спарсить этот сайт. Это тоже не проблема.
Я указывал принудительно при парсинге ту кодировку которая у этих "странных" сайтов, но вопросики остались.
ATF вне форума Ответить с цитированием
Старый 28.05.2016, 17:46   #4
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

ATF, попробуйте открыть этот сайт в обычном нотепад ++ и конвертнуть в UTF-8 и после этого скормить курлу
Код:
curl_setopt($ch, CURLOPT_URL, $url);
если все сработает то у вас будет формироваться база сайтов отдавших вопросы, в таком случае, будете выкачивать всю страницу конвертировать, в php есть фунции конвертирования в различные кодировки, и после этого отдавать курлу. можно это исключение делать в том же цикле, но я рекомендую отдельно дополнительно делать проходку.

заоодно получите лог сайтов отлающих вопросы.

Вполне возможно что и курл как-то обрабатывает, например, обновление PHP сервера до последней версии как вариант

вообще в парсинге материалы для работы я всегда выкачиваю сначала, потом преобразую и только потом работаю.
сайт может быть не доступен и будет ошибка для примера. и так как работа не требует скорости, но требует ведения лога работы - все выкачивается.
Alar вне форума Ответить с цитированием
Старый 28.05.2016, 19:26   #5
ATF
 
Регистрация: 08.05.2016
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Alar Посмотреть сообщение
вообще в парсинге материалы для работы я всегда выкачиваю сначала...
Отличная идея! Но как выкачать, имея просто урл? Возможно ламерский вопрос, но я не профи, а любитель...
ATF вне форума Ответить с цитированием
Старый 28.05.2016, 20:01   #6
ATF
 
Регистрация: 08.05.2016
Сообщений: 6
По умолчанию

Для себя вопрос решил так:

Забираю контент в чистом виде по урлу примерно так:
$page = @file_get_contents($request);

Затем здесь берем библиотеку: http://popoff.donetsk.ua/text/work/libs/a/charset/ и используем
function charset_x_win()
чтоб преобразовать любую строку на русском языке из неизвестной кодировки в кодировку windows-1251.

Т.к. я работаю с utf-8 я затем зная что весь контент со всех сайтов уже в кодировке ср1251, конвертирую в utf-8:
if($codir != 'UTF-8'){ $content = iconv("cp1251","utf-8",$content); }

Теперь весь контент единообразно и корректно отображается, и весь в utf-8.
ATF вне форума Ответить с цитированием
Старый 28.05.2016, 20:40   #7
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

ATF, ну и замечатльно! я даже не успел ответить что там обычный get
Alar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указать кодировку файла. Возможно? Maks512 Visual C++ 3 11.02.2014 19:47
Как указать путь для отправки файла на мыло Chicker Общие вопросы Delphi 10 26.09.2012 08:14
Как указать для Query - Connection с другой формы??? tim21701 БД в Delphi 4 22.01.2012 02:22
Как из мемо считать i-ую строку для парсинга. TwiX Общие вопросы C/C++ 0 17.12.2009 21:49
Как указать область на листе для макроса ru3000 Microsoft Office Excel 2 07.08.2009 23:05