Почему в выходном .txt файле парсера кракозябры?

Ссылка скопирована
2 января 2026 1 ответ

Есть такой парсер карточки товара интернет-магазина 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?

  • Смотрите содержимое файла в кодировке cp1252, переключите в просмотрщике кодировку на 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">

    • Заработало, спасибо!
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Стас DB Ответ

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

    1. Кодировка файла: Убедитесь, что кодировка вашего исходного файла и выходного файла совпадает. Например, если ваш исходный файл закодирован в UTF-8, убедитесь, что выходной файл также сохранен в UTF-8.

    $file_content = file_get_contents('output.txt');
    echo $file_content;

    $file_content = file_get_contents('output.txt'); echo $file_content;

    2. Некорректное использование функций: Убедитесь, что правильно используете функции для чтения и записи файла. Например, если используете функцию file_get_contents() для чтения файла, убедитесь, что она правильно обрабатывает специальные символы.

    3. Неправильная обработка символов: Проверьте, что ваш парсер правильно обрабатывает специальные символы, такие как кавычки, угловые скобки и т.д. Может потребоваться использовать функции для преобразования специальных символов в их HTML-сущности.

    4. Ошибки при записи файла: Убедитесь, что у вас нет ошибок при записи файла. Проверьте, что вы правильно открываете файл для записи, используете правильные разрешения и правильно закрываете файл после записи.

    5. Неправильная обработка символов новой строки: Убедитесь, что ваш парсер правильно обрабатывает символы новой строки. В некоторых случаях может потребоваться использовать функцию PHP_EOL для правильной обработки символов новой строки.

    В целом, для решения проблемы с кракозябрами в выходном .txt файле парсера, вам нужно внимательно проверить все вышеперечисленные аспекты и убедиться, что ваш код правильно обрабатывает символы и кодировки. Если проблема остается, попробуйте использовать другие методы чтения и записи файлов или обратитесь к специалисту по программированию для дополнительной помощи.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно