Почему в выходном .txt файле парсера кракозябры?
Есть такой парсер карточки товара интернет-магазина https://ketmin.ru/catalog/futbolki_s_printom/~futb...
$header = array ( 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3', 'Accept-Encoding: gzip, deflate', 'Content-type: application/x-www-form-urlencoded' ); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0"); curl_setopt($ch, CURLOPT_ENCODING , "gzip"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, 'https://ketmin.ru/catalog/futbolki_s_printom/~futbolka-detskaya-ketmin-funny-cvbelyj-3250754514'); $html = curl_exec($ch); curl_close($ch); $dom = new DOMDocument(); @$dom->loadHTML($html); $xpath = new DOMXPath($dom); $description = $xpath->query("//div[contains(@class, 'description')]/div[@class='title--min'][not(contains(text(), 'Таблица'))]/.."); $descriptionArr = iterator_to_array($description); $descriptionTerm = null; $Description = null; foreach ($descriptionArr as $descriptions) { $descriptionTerm[] = $descriptions->nodeValue; } foreach ($descriptionTerm as $descriptions) { $Description .= trim($descriptions); } $arrMainParams = array( "description" => $Description ); $jsonDataProduct = json_encode($arrMainParams, JSON_UNESCAPED_UNICODE); file_put_contents("data_product.txt", $jsonDataProduct); |
$header = array ( 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3', 'Accept-Encoding: gzip, deflate', 'Content-type: application/x-www-form-urlencoded' ); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0"); curl_setopt($ch, CURLOPT_ENCODING , "gzip"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, 'https://ketmin.ru/catalog/futbolki_s_printom/~futbolka-detskaya-ketmin-funny-cvbelyj-3250754514'); $html = curl_exec($ch); curl_close($ch); $dom = new DOMDocument(); @$dom->loadHTML($html); $xpath = new DOMXPath($dom); $description = $xpath->query("//div[contains(@class, 'description')]/div[@class='title--min'][not(contains(text(), 'Таблица'))]/.."); $descriptionArr = iterator_to_array($description); $descriptionTerm = null; $Description = null; foreach ($descriptionArr as $descriptions) { $descriptionTerm[] = $descriptions->nodeValue; } foreach ($descriptionTerm as $descriptions) { $Description .= trim($descriptions); } $arrMainParams = array( "description" => $Description ); $jsonDataProduct = json_encode($arrMainParams, JSON_UNESCAPED_UNICODE); file_put_contents("data_product.txt", $jsonDataProduct);
И вот, в выходной текстовый файл data_product.txt вместо русских символов попадают кракозябры вида ХаÑакÑеÑи . В чем может быть причина? Кодировка на сайте UTF-8.
Дополнительно:
потому что просматриваете вы этот файл через программу, которая не умеет в UTF-8?
Используйте mb_convert_encoding для преобразования HTML в UTF-8 перед его обработкой.
@$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); |
@$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
-
ХаÑакÑеÑи
а где вы здесь увидели HTML, я стесняюсь спросить?
- Ипатьев, в принципе предложение может сработать, т.к. это очень похоже на utf-8, принятый за latin1 и закодированный в utf-8 ещё раз
всё же DomDocument::loadHTML понимает указание кодировки только через<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
, а не используемый сейчас <meta charset="utf-8">
- Заработало, спасибо!
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Проблема с кракозябрами в выходном .txt файле парсера может быть вызвана различными причинами. Вот несколько возможных причин и способы их решения:
1. Кодировка файла: Убедитесь, что кодировка вашего исходного файла и выходного файла совпадает. Например, если ваш исходный файл закодирован в UTF-8, убедитесь, что выходной файл также сохранен в UTF-8.
$file_content = file_get_contents('output.txt'); echo $file_content;
2. Некорректное использование функций: Убедитесь, что правильно используете функции для чтения и записи файла. Например, если используете функцию file_get_contents() для чтения файла, убедитесь, что она правильно обрабатывает специальные символы.
3. Неправильная обработка символов: Проверьте, что ваш парсер правильно обрабатывает специальные символы, такие как кавычки, угловые скобки и т.д. Может потребоваться использовать функции для преобразования специальных символов в их HTML-сущности.
4. Ошибки при записи файла: Убедитесь, что у вас нет ошибок при записи файла. Проверьте, что вы правильно открываете файл для записи, используете правильные разрешения и правильно закрываете файл после записи.
5. Неправильная обработка символов новой строки: Убедитесь, что ваш парсер правильно обрабатывает символы новой строки. В некоторых случаях может потребоваться использовать функцию PHP_EOL для правильной обработки символов новой строки.
В целом, для решения проблемы с кракозябрами в выходном .txt файле парсера, вам нужно внимательно проверить все вышеперечисленные аспекты и убедиться, что ваш код правильно обрабатывает символы и кодировки. Если проблема остается, попробуйте использовать другие методы чтения и записи файлов или обратитесь к специалисту по программированию для дополнительной помощи.