Разработка · 6 мин чтения

IMPORTXML в Google Sheets: парсинг сайта без кода

IMPORTXML в Google Sheets вытаскивает данные с любой открытой страницы сайта прямо в ячейки - заголовки, цены, метатеги, ссылки - без единой строчки кода. Формула регулярно закрывает 70% задач, с которыми ко мне приходят клиенты: «хочу отслеживать цены конкурентов», «нужно вытащить список товаров с сайта поставщика», «собрать заголовки и description со всех страниц перед SEO-аудитом». В части случаев Google Таблицы справляются сами, и платить за парсер на Python просто незачем.

Что такое IMPORTXML и когда она реально нужна

IMPORTXML - встроенная функция Google Таблиц, которая забирает содержимое страницы по URL и вытаскивает из неё нужные узлы через XPath-запрос. По сути это мини-парсер прямо в ячейке: не нужен сервер, библиотеки, cron-задачи. Работает с XML, HTML, CSV, TSV, RSS и Atom-фидами.

Я подключаю IMPORTXML в трёх типичных сценариях:

  • разовый или регулярный мониторинг цен конкурентов - актуально для владельцев магазинов на WooCommerce и Tilda, которые вручную сверяли прайсы раз в неделю;
  • сбор SEO-данных: title, meta description, h1 по списку URL перед аудитом или редизайном;
  • быстрая выгрузка структурированных данных с открытых страниц - курсов валют, расписаний, каталогов без API.

Важное условие: страница должна отдавать готовый HTML при обычном GET-запросе. Если контент подгружается через JavaScript после загрузки страницы (React/Vue-каталоги, бесконечный скролл), IMPORTXML увидит пустой каркас и вернёт ошибку - об этом ниже отдельно.

Синтаксис IMPORTXML и как построить рабочий XPath

Базовая конструкция выглядит так:

=IMPORTXML(url; xpath_query)

Первый аргумент - ссылка на страницу (можно передать текстом в кавычках или ссылкой на ячейку с URL), второй - XPath-запрос, который указывает, какой узел документа вытащить. Несколько формул, которые закрывают большинство практических задач:

=IMPORTXML(A2;"//h1") - вытащит текст заголовка h1 со страницы, указанной в ячейке A2.

=IMPORTXML(A2;"//span[@class='price']") - заберёт содержимое span с конкретным классом; так я обычно достаю цену товара, если верстка магазина её выделяет отдельным классом.

=IMPORTXML(A2;"//meta[@name='description']/@content") - забирает атрибут content у мета-тега description. Формулу с атрибутом /@content использую в 90% SEO-аудитов вместо ручного открытия каждой страницы.

=IMPORTXML(A2;"//a/@href") - вытащит все ссылки со страницы, каждая в отдельной строке. Удобно, чтобы быстро собрать структуру сайта перед составлением sitemap вручную.

XPath я не держу в голове - открываю страницу в Chrome, через DevTools нахожу нужный элемент (Ctrl+Shift+C), кликаю правой кнопкой по узлу в панели Elements и выбираю Copy → Copy XPath. Готовый путь вставляю в формулу, но почти всегда упрощаю его вручную: браузер выдаёт длинный абсолютный путь вида /html/body/div[3]/div[1]/section/div[2]/span, который ломается при любом изменении верстки. Я заменяю его на путь по классу или атрибуту - так формула переживает мелкие правки дизайна сайта.

Практические примеры: цены, отзывы, курсы валют

Разберу три реальных кейса, с которыми сталкивался за последний год.

Мониторинг цен конкурентов

Клиент с интернет-магазином на WooCommerce вёл таблицу цен пяти конкурентов вручную - уходило часа два в неделю. Собрал таблицу, где в столбце A список URL карточек товаров, а в B формула вида =IMPORTXML(A2;"//span[contains(@class,'price')]"). Google Таблицы обновляют значение при каждом открытии файла и раз в час автоматически - этого хватает для еженедельного мониторинга без ручной работы.

Сбор SEO-метаданных перед аудитом

Перед аудитом сайта на 200+ страниц выгружаю список URL из Screaming Frog или sitemap.xml в столбец, а рядом тяну title, description и h1 отдельными формулами IMPORTXML. За 5-10 минут получаю таблицу, по которой сразу видно дубли title и пустые description - раньше на это уходил день ручной проверки.

Курсы валют и котировки

Для клиента, считавшего стоимость закупки в юанях, настроил формулу =IMPORTXML("https://www.cbr.ru/scripts/XML_daily.asp";"//Valute[@ID='R01375']/Value") - она забирает курс юаня напрямую с XML-страницы ЦБ РФ. Курс подтягивается в таблицу расчёта себестоимости автоматически, без ручного обновления раз в день.

Бесплатный материал

🎁 Полезный скрипт в подарок

Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.

Без спама. Отписка в 1 клик.

Частые ошибки и ограничения IMPORTXML

Ошибка #N/A вылетает чаще всего по одной из пяти причин:

Причина Как проверить Решение
Сайт рендерит контент через JavaScript Ctrl+U (просмотр исходного кода) - если нужного текста там нет, значит его добавляет скрипт после загрузки IMPORTXML не подойдёт, нужен headless-браузер (Puppeteer/Playwright) на стороне Python-парсера
Неверный XPath Проверить запрос в консоли браузера через $x("//путь") Упростить путь, привязать к классу или атрибуту вместо номера элемента
Сайт блокирует запросы без User-Agent браузера Формула стабильно даёт #N/A на конкретном домене, хотя XPath верный IMPORTXML не подменяет заголовки - обойти это средствами таблиц нельзя, нужен отдельный скрипт
Превышен лимит функций импорта Ошибки появляются после добавления 40-50‑й формулы IMPORTXML/IMPORTHTML в файле Google ограничивает количество таких формул на документ - разносить сбор по нескольким таблицам
Устаревший кэш Данные на сайте изменились, а в таблице старые Google Таблицы кэшируют результат IMPORTXML примерно на час - принудительно обновить можно, скопировав и вставив формулу заново

Отдельно стоит сказать про авторизацию: IMPORTXML не умеет логиниться, слать куки или проходить капчу - работает только с открытыми страницами без ограничений доступа. Для закрытых разделов сайта (личный кабинет, B2B-каталог за логином) формула бессильна в принципе, здесь нужен скрипт с сессией.

IMPORTHTML и IMPORTFEED - соседние формулы для похожих задач

IMPORTXML - не единственный инструмент для парсинга в Google Таблицах, и часто соседняя формула проще подходит под задачу.

IMPORTHTML вытаскивает целиком таблицу или список со страницы, без XPath:

=IMPORTHTML("https://example.com/rates";"table";1)

Второй аргумент - «table» или «list», третий - порядковый номер таблицы/списка на странице. Использую её, когда нужно перенести готовую таблицу тарифов или сравнения характеристик целиком, без выборки отдельных ячеек.

IMPORTFEED читает RSS и Atom-ленты:

=IMPORTFEED("https://site.ru/feed")

Подключал её клиенту для автоматического сбора заголовков новостей блога конкурентов в одну таблицу - обновляется само по мере выхода новых постов, без единой ручной операции.

Инструмент Что забирает Нужен код Работает с JS-сайтами Авторизация
IMPORTXML Любой узел по XPath Нет Нет Нет
IMPORTHTML Готовые таблицы и списки Нет Нет Нет
IMPORTFEED RSS/Atom-ленты Нет Не требуется Нет
Python-парсер Любые данные, любая логика Да Да, через headless-браузер Да

Когда таблицы уже не справляются и нужен полноценный парсер

IMPORTXML отлично держит разовые и небольшие регулярные задачи - до пары десятков страниц с открытым HTML. Но упирается в потолок в трёх ситуациях: когда каталог рендерится через JavaScript, когда нужно обходить сотни и тысячи страниц по расписанию с логированием ошибок, и когда результат должен уходить дальше - в CRM, Telegram-бота на aiogram или в таблицу с уведомлением при изменении цены.

Для таких задач я перехожу на Python-скрипт (requests/BeautifulSoup для статичных страниц, Playwright - для JS-каталогов) с записью результата в базу или Google Sheets через API, либо собираю цепочку в n8n, если клиенту важно самому донастраивать логику без программиста. Разница в подходе понятна на примере: таблице с IMPORTXML для мониторинга 5 конкурентов хватает с головой, а для интернет-магазина, который отслеживает 3000 SKU у 15 поставщиков каждую ночь и шлёт алерт в телеграм при просадке цены, нужен уже отдельный сервис с очередью запросов и защитой от банов по IP. В библиотеке готовых решений на сайте есть готовые скрипты для парсинга, с которых можно стартовать, если задача укладывается в типовой сценарий.

Данные и процессы на автопилоте

Парсинг / Автоматизация

от 20 000 ₽

Подробнее →

Частые вопросы

Почему IMPORTXML выдаёт ошибку #N/A, хотя формула написана правильно

Чаще всего это значит, что нужные данные добавляются на страницу через JavaScript уже после загрузки - Google Таблицы читают только исходный HTML-ответ сервера и не выполняют скрипты. Проверить просто: открыть исходный код страницы (Ctrl+U) и поискать искомый текст - если его там нет, IMPORTXML его тоже не найдёт. Второй частый вариант - сайт отдаёт другой ответ ботам без браузерного User-Agent, тогда формула стабильно падает на конкретном домене независимо от корректности XPath.

Сколько формул IMPORTXML можно использовать в одной таблице

Google ограничивает суммарное число функций импорта (IMPORTXML, IMPORTHTML, IMPORTDATA, IMPORTFEED) примерно 50 штуками на документ - после этого начинают вылетать ошибки даже у корректных формул. Если нужно парсить больше страниц, задачу разносят по нескольким файлам или переходят на отдельный скрипт с постановкой в очередь.

Можно ли через IMPORTXML собирать данные с сайтов, требующих авторизации

Нет - формула отправляет обычный GET-запрос без куки, сессии и заголовков логина, поэтому видит страницу так же, как неавторизованный посетитель. Для личных кабинетов, закрытых B2B-каталогов и разделов за паролем нужен скрипт с эмуляцией сессии - таблицами эту задачу не закрыть в принципе.

Как часто обновляются данные, полученные через IMPORTXML

Google Таблицы кэшируют результат примерно на час и автоматически пересчитывают формулы при каждом открытии файла. Для более частого обновления (раз в 5-10 минут) в таблицах штатных средств нет - такую частоту дают уже скрипт на Python с отдельным расписанием или сценарий в n8n.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Самозанятый Калинкин Н. А. · работаю с физлицами и юрлицами

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно