Пользователь
0,2
рейтинг
25 марта 2014 в 11:29

Разработка → Корректный YML для Яндекс.Маркета. Взгляд программиста


Многие интернет-магазины попадают в Яндекс.Маркет, не все там остаются надолго. Одно из условий присутствия в ЯМ-е – наличие корректного прайса в специальном формате YML.

Проверка такого прайса на ошибки и устранение таковых – целая история. Пока он не будет сформирован по всем правилам – вход в сие царство демпинга заказан. А при доведении документа до ума можно пережить немало незабываемых эмоций.

Данная статья – попытка обобщить те ошибки, с которыми сталкиваются программисты, впервые создающие инструменты (будь то автономный скрипт или плагин для CMS) для генерации YML-файла. Тем, кто с этим чудным форматом имел дело раньше, статья уже будет не столь интересна, ибо всё шишки набиты. Впрочем, вдруг и ветераны борьбы за своё место под солнцем Яндекса узнают что-то новое для себя. А то и поделятся собственным фронтовым опытом.

Классификация ошибок


  1. Неактуальные ошибки


    • Не та кодировка. Первое обо что спотыкались в старые добрые времена. Большинство движков работают на UTF-8, а ЯМ когда-то требовал только любимую кодировку Windows. Поговаривают, что капризного Яшу можно было объегорить – сделать вид, что согласны на богомерзкую cp1251 при утверждении магазина, после того как «таможня даёт добро» – преспокойно заменить прайс на расово верный Юникод. Что интересно – CSV (как нежелательную альтернативу YML) Яндекс.Маркет принимает исключительно в UTF-8 :)

    Все остальные грабли лежат всё там же.

  2. Ошибки спецификации XML



    YML – это частный случай XML. А значит, должен соответствовать его основным правилам. Не забываем об обязательном наличии <?xml ?> и <!DOCTYPE>, следим за правильной вложенностью тегов, заменяем «великолепную пятёрку» (", &, <, >, ') на их мнемонические эквиваленты.

    Причём, в самих мнемониках символ & на его мнемонику &amp; менять не нужно, а то какая-то бесконечная рекурсия может получиться. Прежде чем применять к тексту (для элемента <description>, например) функцию htmlspecialchars, следует учесть, что там уже могут мнемоники изначально присутствовать ;)

  3. Критичные ошибки YML


    Теперь Ваш прайс – кошерный XML, но Яндекс наотрез отказывается его принимать. Разбираемся дальше.

    • Ошибки в использовании элементов. Перечитываем 3 раза (а ещё лучше — 5) внимательно официальную документацию, не забываем про глобальные теги (<yml_catalog>, <shop>), следим за правильным написанием названий, не занимаемся отсебятиной в виде придумывания несуществующих в спецификации тегов, всю иерархию расставляем по yml-скому фен-шую, указываем правильно параметры и т.д.


    • Отсутствие обязательных элементов. Самые частые ошибки новичков и не очень новичков. Особенно часто такое всплывает при формировании offer-ов. Необязательный тег для одного вида описаний может оказаться обязательным для другого. К примеру, <vendor>. На такое можно напороться, если раньше к продукции применялось упрощённое описание, а потом вдруг решили переделать на vendor.model.

    • Не каноничный порядок элементов. Очень подлая ошибка, прям-таки удар под дых для тех, кто с ней сталкивается впервые. Ситуация, когда Яндекс невозмутимо настаивает, что в строке такой-то позиция такая-то что-то не так, а в указанном месте ничего подозрительного и в упор не видно (причём, гугление форумов и медитация на офдокументацию эффекта не даёт) – способна довести любого до белого каления.
      А ларчик просто открывается – элементы должны идти именно в том порядке, в котором они перечислены в спецификации. Вот в упрощённом описании сначала название товара, а потом производитель. А в vendor.model сначала производитель, а потом название товара. И ни в коем разе не наоборот.

    • Повторы продукции по ID. Что умиляет, ошибка эта Яндексом выдаётся сразу двумя разными способами (чтобы никто не запутался) – сначала перечисляются элементы с некорректными идентификаторами, а потом идёт список предложений-дубликатов.
      С перепугу можно решить, что ошибок в 2 раза больше, чем на самом деле. И если с дубликатами всё понятно, то непосвящённым ещё предстоит догадаться чем именно некорректны некорректные идентификаторы.

  4. Некритичные ошибки YML



    Яндекс почти ублажен. Поработаем ещё немного.

    • Некорректные URL. Часто это ссылки, например, содержащие пробельные символы или русские буквы. Вообще, во многих движках в таблицах БД обычно есть поля, хранящие прямые линки на страницы продукции. Что характерно, почти во всех CMS среди этих ссылок очень много мусора и поэтому обычно приходится генерировать самому.

    • Цена равна 0. Здесь программисту нужно посовещаться с контент-менеджером. Или фильтровать нулевые цены, но тогда о товарах, где забыли указать стоимость, вспомнят нескоро. Или не фильтровать и пускай в будущем контент-менеджер с претензиями Яндекса сам разбирается.

    • Неверные ссылки на картинки. Ну, тут примерно та же история, что и с неправильными URL. Прописанных в базе данных картинок часто не существует в природе. Прежде чем оформлять очередной <picture> – проверяйте наличие файла. Если картинка в наличии, но в названии есть злополучные пробелы – кодируйте ссылки в RFC3986 (функция rawurlencode Вам в помощь).


  5. Прочие ошибки


    ОК, все огрехи тотально устранены и скормленный Яндексу yml-прайс не выплёвывается обратно. Погодите расслабляться, через пару дней вполне может прийти «письмо счастья» от менеджеров ЯМ-а, в котором уведомляется, что:

    • Товарный ряд сплагиачен из другого магазина. Особо тяжкое преступление, караемое по всей строгости закона.
    • В вашем прайсе мы упорно искали и таки нашли дубликаты!
    • И кстати, некоторые ссылки ведут не туда.
    • Какой идиот создавал эту категоризацию?
    • В качестве фото продукции используются заглушки.
    • Одни и те же фото у разных товаров. Ну и что с того, что на официальном сайте производителя то же самое?
    • А некоторые картинки вообще не с Вашего сайта.
    • В мутных водах элементов <description> плавает «рыба».
    • В магазине 100% предоплата, но почему об этом ни гу-гу в теле необязательного элемента <sales_notes>?
    • Ах, у Вас из 500 товаров есть всего один «под заказ»? А почему у него aviable=’true’, а не ‘false’?
    • У вас, уважаемые, доставка 3 дня, а по нашим понятиям товар считается «доступным» если доставляется в течении 2-х.
    • … и всякое-такое прочее.

    А посему Ваша лавочка пока отстранена от присутствия в торговой вселенной Яндекс.Маркета на срок от недели до навсегда.

    По большому счёту, подобные ошибки вне компетенции кодеров. За них отвечают другие специально обученные люди – контент-менеджеры, SEO-шники, маркетологи или кого там ещё нагрузили следить за содержимым сайта. Впрочем, программисты иногда могут помочь и здесь. Например, фильтруя картинки-заглушки (определяя их по стандартным названиям) или не пропуская описания продукции, почему-то начинающиеся со слов «Lorem ipsum» и «bla bla bla».


Как и где проверять ошибки


Отлавливать все эти многочисленные ляпы проще всего в таком порядке.

  • Ошибки XML. Хозяюшке на заметку – дублируйте yml-файлы с расширением xml, по крайней мере в период тестирования (да и потом может пригодиться). В браузерах и текстовых редакторах yml-документы открываются как унылые текстовики, что делает их неудобными для просмотра и анализа. В дебрях XML ориентироваться намного проще: там всегда весёленькая подсветка тегов + элементы можно «схлопнуть» в соответствии с их иерархической структурой + браузер услужливо подскажет где несоответствия спецификации. В общем, отследить ошибки YML проще, открыв его как XML.

  • Проверка в Яндекс-Маркете. Ну, и последнее слово – за Яндексом. Зарегистрировав магазин, проверяйте файл в ихнем валидаторе и устраняйте выдаваемые ошибки до победного конца.


Ссылки


Яндекс:

Официальная спецификация YML
Требования к методу передачи данных
Валидатор
Вопросы и ответы
Требования к рекламным материалам

Хабрахабр:

Яндекс.Маркет – to be or not?
Размещение товаров на Яндекс.Маркете. Типичные проблемы и их решение
Ночное ворчание о Яндексе, Маркете и интерфейсах вообще

Опрос

Приходилось ли вам с нуля писать скрипты/плагины для генерации YML?
34%
(49)
Да, особых затруднений никогда не было
24%
(34)
Да, когда настраивал первый раз – проклял всё на свете
42%
(60)
Нет, не приходилось

Проголосовало 143 человека. Воздержалось 30 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Валерий Макаров @valemak
карма
58,2
рейтинг 0,2
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (18)

  • НЛО прилетело и опубликовало эту надпись здесь
    • +3
      А чего там сложного парсить-то (да и формировать), когда есть DTD схема? json по той же причине не использовался надо думать — ибо официального стандарта схем его на тот момент просто не существовало (да и сейчас всё не так и празднично в этом месте).
      • НЛО прилетело и опубликовало эту надпись здесь
        • +5
          и как давно xml в php парсится сложнее? Я, конечно, уже лет 8 не пишу на php, но вот сходу попробовал:
          $xmlstr = file_get_contents('YML.xml');
          $v = new SimpleXMLElement($xmlstr);
          echo $v->shop->name;
          

          и оно как бэ сработало… Что я делаю не так?
          Быть может Вам стоит-таки почитать какую-нибудь книжку вида «PHP за 21 час» ?))
          • НЛО прилетело и опубликовало эту надпись здесь
  • +2
    Помню, когда работал над формированием yml, все трижды проклял как раз-таки из-за «цена равна 0». Это самая большая проблема, которая начинает цепочку «а, это я не знаю, спроси у %сосед-name%».
  • +4
    Может, я чего-то не понимаю?

    В тексте указывается, что YML — это XML. И по ссылке на определение его тоже так сказано. Но в конце статьи два раза даётся ссылка на онлайн-парсер Yaml. Это же разные вещи, нет?
    • 0
      Тут имеет место коллизия наименований, не только Вас сбивающая с толку.

      Есть ещё один YAML, изобретение Кларка Эванса, используемое как файл конфигурации в различных языках программирования, платформах и просто отдельных фреймворках (RoR, Dart, Symfony, Google App Engine и др.)

      ru.wikipedia.org/wiki/Yaml
      www.yaml.org

      Название — YAML, формат файлов .yml. Так же как и у Яндекса.
      Но у Яндекса то разновидность xml, а у Эванса — альтернатива xml.

      • 0
        Да, я в курсе что такое Yaml, я его использую в проектах :) просто не очень было понятно, причём он здесь, когда описываемый формат XML-like. Спасибо за разъяснение.
    • 0
      На всякий случай убрал ссылку на тот парсер из статьи. Вы будете смеяться, но упомянутый сервис подходит и для тестирования yml :) Но поскольку его предназначение совсем другое, во избежание путаницы убираю.
  • +2
    Писал несколько раз генерацию yml, ни разу особых проблем не было. Писал и на java, и на python.
  • 0
    delete

  • 0
    Писал несколько раз для выгрузки в Яндекс(да простят меня боги), единственный раз не возникло проблем с выгрузкой авто, а дальше было «в гостях у Аида» ошибки спецификации, несогласованность и т. д. Все писалось в «Я» они любезно отвечали :) ЗЫ: Из последнего — «яндекс острова», благо все оперативно исправлялось и это тестирование было. И последнее не надо говорить что Яндекс не делает ошибок и все просто.
  • +1
    Писал несколько раз генерацию, трудности возникли при понимании документации. Многие вещи, достаточно «наркомански» написаны, некоторых нужных элементов нет в документации или они плохо описаны. Возможно, сейчас ситуация изменилась.
  • 0
    Прошел год и ничего особо не поменялось
  • 0
    Прошел ещё год и ничего особо не поменялось. До сих пор актуально.
  • 0
    Подскажите, пожалуйста, можно ли указать у одного товара несколько разделов?
    • 0
      Если это именно для Яндекс-Маркета (YML часто юзают для подключения и к другим площадкам — Berito, Wikimart и проч.) то только один. Насчёт других партнёрок не в курсе, возможно где-то допускается и несколько.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.