Pull to refresh

XML сайты в результатах поиска

Reading time6 min
Views7K

Что такое XML сайт


XML сайт это сайт, страницы которого являются простыми XML файлами с MIME типом "text/xml" "application/xml"(XML Media Types). Они содержат только уникальные данные для этой страницы.


В таком XML файле задаётся ссылка на XSLT шаблон, который преобразует XML в HTML или в XHTML в браузере пользователя.


Проблема


Для классических html веб страниц поисковики в качестве заголовка отображают содержимое тега title. В описании отображается кусочки текста с найденными ключевыми словами или содержимое тега meta description.


Поисковики обычно не исполняют скрипты на страницах которые индексируют и соответственно не видят конечный вариант страницы после их исполнения. Соответственно они не видят теги title и meta которые вставляются XSLT шаблоном. Они индексируют текст который есть в XML документе как есть.


Решение


Наша задача правильно добавить теги title и meta в XML чтобы браузер, поисковик и меседжер в котором отправляется ссылка на страницу их понимали.


Таким же образом можно будет добавить и другие HTML теги для поисковиков, меседжеров и даже браузера если он вдруг не исполнит XSLT шаблон.


результат
Google
image
Yandex Webmaster
image

Как страница отображается без тегов


Например у нас такой XML:


<запись>
    <заголовок>Текст заголовка</заголовок>
    <текст>Текст записи</текст>
</запись>

Как он отображается в поиске без title и meta тегов:


  1. XML показывается в одну строку (Гугл)
    Заголовок: <запись><заголовок>Текст заголовка</заголовок><текст>...
    Описание: <запись><заголовок>Текст заголовка</заголовок><текст>Текст записи</текст></запись>
  2. Сокращённый вариант (duckduckgo.com)
    Заголовок: example.com
    Описание: запись>заголовок>Текст заголовка...
  3. Только содержимое тегов в загаловке (startpage.com)
    Заголовок: Текст заголовка Текст записи
  4. Страница не отображается в поиске (Яндекс)
    Я запускал несколько раз переиндексацию страницы но яндексу упорно не нравился mime тип страницы. Потом когда я начал писать эту статью они мне прислали увидомление что добавили в поиск. Но сегодня страница снова исчезла из поиска.

Вставляем теги


Для того чтобы вставить теги title и meta в xml и при этом браузер и поисковик понимали что это html теги им надо задать пространство имён "http://www.w3.org/1999/xhtml".


Варианты вставки:


  1. Задать префикс для html тегов.


    <!-- родительском элементе объявляем префикс 'xh' для xhtml элементов -->
    <запись xmlns:xh="http://www.w3.org/1999/xhtml">
        <!-- далее используем этот префикс перед именем элемента -->
        <xh:title>Текст заголовка для страницы поиска и меседжеров</xh:title>
        <xh:meta name ="description" 
                 content="Часть текста записи для страницы поиска и меседжеров"/>
    
        <!-- у элементов без префикса пространство имён остаётся пустым -->
        <заголовок>Текст заголовка</заголовок>
        <текст>Текст записи</текст>
    </запись>

    Этот вариант самый краткий но выяснилось что Гугл его не понимает.


    UPD (04.08.2020): Похоже Гугл таки понял данный вариант но задал пока только заголовок.


    UPD (26.08.2020): Яндекс применил тестовым XML страницам с <!DOCTYPE html> шаблон и взял заголовок и описание из результата. Тестовые страницы появились в результатах поиска Яндекса.


  2. Обернуть в элемент с заданным пространством имён поумолчанию.


    <запись>
        <!-- в теге head определяем пространство имён поумолчанию -->
        <head xmlns="http://www.w3.org/1999/xhtml">
            <!-- все дочерние элементы наследуют это пространство имён -->
            <title>Текст заголовка</title>
            <meta name="description" content="Часть текста записи для страницы поиска и меседжеров"/>
        </head>
    
        <!-- элементы вне тега head остаются с пустым пространством имён -->
        <заголовок>Текст заголовка</заголовок>
        <текст>Текст записи</текст>
    </запись>

    Тут пространство имён поумолчанию задаётся в родительском элементе и распространяется на дочерние.


    Гугл понял такой вариант и использовал текст из title в качестве заголовка и текст из meta description в качестве описания страницы.


    UPD (04.08.2020): В этом варианте на тестовых страницах Гугл задал заголовок и описание после применения XSLT шаблона.


    UPD (20.08.2020): После добавления <!DOCTYPE html> на тестовых страницах Яндекс взял информацию из title и meta description но посчитал страницу не достаточно качественной.


    С этим вариантом возникает проблема на web.archive.org. Архив в данном виде воспринимает страницу как html и пихает в неё свои теги "поправляя" те теги которых не знает. В результате документ перестаёт быть правильным XML и не отображается.


    Пример работы web.archive.org над этим вариантом.


    &lt;запись&gt;
        <head xmlns="http://www.w3.org/1999/xhtml"><script ...</script>
            <title>Текст заголовка</title>
            <meta name="description" content="Часть текста записи для страницы поиска и меседжеров"/>
        </head>
        &lt;заголовок&gt;Текст заголовка&lt;/заголовок&gt;
        &lt;текст&gt;Текст записи&lt;/текст&gt;
    &lt;/запись&gt;

  3. Задать пространство имён поумолчанию каждому элементу индивидуально.


    <запись>
    
        <!-- задаём пространство имён каждому элементу индивидуально -->
        <title xmlns="http://www.w3.org/1999/xhtml">Текст заголовка</title>
        <meta name="description" content="Часть текста записи для страницы поиска и меседжеров" xmlns="http://www.w3.org/1999/xhtml"/>
    
        <!-- остальные элементы остаются с пустым пространством имён -->
        <заголовок>Текст заголовка</заголовок>
        <текст>Текст записи</текст>
    </запись>

    Данный способ хорош когда нам нужен только один элемент из этого пространства имён и мы можем указать его пространство имён прям в нём.


    Этот вариант я только поставил на тест так что результат отображения в Гугле не известен.
    UPD (27.07.2020): На живом сайте в таком варианте Гугл подхватил заголовок. Описание осталось пустым. Я решил попробовать переместить xmlns в конец meta тега чтобы он больше был похож на обычный html. Ждём следующей переиндексации.


    UPD (04.08.2020): На тестовых страницах Гугл задал заголовок до применения XSLT шаблона а описание после его применения.


    UPD (10.08.2020): На живом сайте в этом варианте Бинг корректно отображает заголовок и описание.


    UPD (20.08.2020): После добавления <!DOCTYPE html> на тестовых страницах Яндекс взял информацию из title и meta description но посчитал страницу не достаточно качественной. На живом сайте он также задал название и описание страницы и отобразил страницу в поиске.


    UPD (26.08.2020): Яндекс применил тестовым XML страницам с <!DOCTYPE html> шаблон и взял заголовок и описание из результата. Тестовые страницы появились в результатах поиска Яндекса.



Шаблон


После проведения всех экспериментов итоговый шаблон XML у меня такой:


<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="style.css" type="text/css" ?>
<?xml-stylesheet href="style.xsl" type="text/xsl" ?>
<!DOCTYPE html>
<корень>
    <title xmlns="http://www.w3.org/1999/xhtml">[Заголовок страницы]</title>
    <meta name="description" content="[Описание страницы]" xmlns="http://www.w3.org/1999/xhtml" />
    <meta name="keywords" content="[ключевые слова]" xmlns="http://www.w3.org/1999/xhtml" />

    <!-- содержимое XML документа -->
</корень>

Отдаётся документ с MIME типом "application/xhtml+xml" для Гугла и директивой <!DOCTYPE html> для Яндекса чтоб они исполнили XSLT шаблон на странице.


Результат


После правильной вставки тегов title и meta в результатах поиска после переиндексации страницы она появляется уже с заданным заголовком и описанием. Также после отправки ссылки на сайт в сообщении подгружается её заголовок и описание.


Ссылки


Страница с ссылками на примеры: ivan386.github.io/xml-site-index-test/


Примеры я создал сегодня(10.07.2020). Надо подождать пока поисковики их проиндексируют.


UPD (27.07.2020): На данный момент только Бинг показывает одну из XML в результатах поиска. Это первый вариант XML и Бинг также как и Гугл не увидел в ней заголовка и описания. Возможно поскольку мало текста в самих XML документах поисковики неохотно их показывают и они задержались в песочнице.


UPD (04.08.2020): Гугл наконец то показал некоторые тестовые страницы в поиске. Я за это время их сделал много. На некоторых он даже применил XSLT шаблон и взял заголовок и описание после применения.


UPD (20.08.2020): После добавления тестовым XML страницам <!DOCTYPE html> Яндекс прочитал на некоторых заголовок и описание но решил не отображать их в поиске так как посчитал их не качественными. При тестировании этого метода на живом сайте он таки появился в поиске Яндекса с правильным названием и описанием.


UPD (26.08.2020): Яндекс применил тестовым XML страницам с <!DOCTYPE html> шаблон и взял заголовок и описание из результата. Тестовые страницы появились в результатах поиска Яндекса.


Эти страницы в Гугле: site:ivan386.github.io/xml-site-index-test/
Эти страницы в Яндексе: site:ivan386.github.io/xml-site-index-test/
Эти страницы в Бинг: site:ivan386.github.io/xml-site-index-test/
Эти страницы в DuckDuckGo: site:ivan386.github.io/xml-site-index-test/

Tags:
Hubs:
Total votes 5: ↑4 and ↓1+5
Comments28

Articles