Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как указать кодировку для парсинга?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: кодировка, парсинг, curl_setopt
Странник
Отправлено: 28 Мая, 2016 - 16:54:25
Post Id



Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Апр. 2010  


Помог: 0 раз(а)




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

PHP:
скопировать код в буфер обмена
  1. $th2[$i] = $url ; // формирую массив с URL-ами
  2. $ch = curl_init();
  3. curl_setopt($ch, CURLOPT_URL, $url);
  4. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  5. curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);        
  6. curl_setopt($ch, CURLOPT_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");
  7.            
  8. $content[$i] = $this->Translit->htmlRemove(curl_exec($ch));
  9. // Устанавливается порядок определения кодировки по указанному списку:
  10. mb_detect_order("eucJP-win,sjis-win,UTF-8");
  11. $codir[$i] = mb_detect_encoding($content[$i]);
  12. if($codir[$i] != 'UTF-8'){ $content[$i] = iconv("cp1251","utf-8",$content[$i]); }
  13.  


Вот что имеем на выходе:
Нажмите для увеличения


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

Я программист-любитель. Прошу не пинать сильно.
 
 Top
Мелкий Супермодератор
Отправлено: 28 Мая, 2016 - 17:03:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




curl вообще бинарный. Ему на кодировки фиолетово. Его дело - транспорт, бинарно-безопасный транспорт.

Сами ручками из заголовков достаёте Content-Type, парсите, получаете кодировку. Если нет заголовка, парсите и читаете мета-теги, если и там нет (или ещё веселее, есть и там и там, но разные, а сам документ - вовсе в третьей) - пытаетесь угадать по контенту.
Или берёте что-нибудь более сложное и удобное, чем пинать голый транспортный курл.


-----
PostgreSQL DBA
 
 Top
Странник
Отправлено: 28 Мая, 2016 - 17:42:27
Post Id



Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Апр. 2010  


Помог: 0 раз(а)




Мелкий пишет:
Сами ручками из заголовков достаёте Content-Type, парсите, получаете кодировку. Если нет заголовка, парсите и читаете мета-теги, если и там нет (или ещё веселее, есть и там и там, но разные, а сам документ - вовсе в третьей) - пытаетесь угадать по контенту.

Делал так, принудительно указывал кодировку, но видимо она не соответствовала реальности т.к. вопросы оставались.
Мелкий пишет:
...пытаетесь угадать по контенту.
Как? Подскажите.
Мелкий пишет:
Или берёте что-нибудь более сложное и удобное, чем пинать голый транспортный курл.

Раз спрашиваю, значит не знаю. Зачем умничать. Может лучше подсказать?
 
 Top
Мелкий Супермодератор
Отправлено: 28 Мая, 2016 - 19:17:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Странник пишет:
Раз спрашиваю, значит не знаю

Дык это и есть предложение искать куда-нибудь в эту сторону. Я не в курсе, что сейчас есть живое.
Например, есть тяжёлая артиллерия в виде phantomjs, уж если headless chromium не прочитает, то у рядовых юзеров точно проблемы будут. Возможно, для вашей задачи это слишком тяжёлая штука, а может и в самый раз будет.

Странник пишет:
Как? Подскажите.

Например, лезете в справочники, смотрите среднее частотное распределение символов кириллического алфавита в тексте. Затем пытаетесь подобрать кодировку, чтобы, образно, символ "а" встречался гораздо чаще "б". Байты в неверной кодировке обычно не встречаются вовсе.
Ну или что-нибудь ещё интересное по запросу "определение кодировки текста".


-----
PostgreSQL DBA
 
 Top
Странник
Отправлено: 28 Мая, 2016 - 19:58:57
Post Id



Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Апр. 2010  


Помог: 0 раз(а)




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

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

Затем здесь берем библиотеку: http://popoff[dot]donetsk[dot]ua/text/wo[dot][dot][dot]/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.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Кодировки и все смежное »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB