Часто при интеграции со сторонними сайтами или парсинге веб-страниц мы сталкиваемся с ситуацией, когда нужные нам данные (например, идентификаторы, цены или массивы данных) находятся не в стандартных HTML-тегах, а зашиты внутри JavaScript-кода страницы. Разберем по шагам, как извлечь содержимое тега script и получить из него конкретную информацию.
Начнем с самого простого и правильного способа парсинга HTML в 1С — использования объекта ПостроительДОМ. Этот объект позволяет преобразовать текст HTML-страницы в удобную объектную модель.
Рассмотрим пример, где нам нужно получить текст самого первого скрипта на странице. Проанализируем следующий код:
ДОМ = ПостроительДОМ.Прочитать(ЧтениеHTML);
СодержимоеТегаСкрипт = ДОМ.ПолучитьЭлементыПоИмени("script").Элемент(0).ТекстовоеСодержимое;
Если же на странице много скриптов и нам нужно найти определенный, мы можем перебрать все теги в цикле. Посмотрим на пример такого перебора:
ВсеТегиСкриптНаСтранице = ДОМ.ПолучитьЭлементыПоИмени("script");
Для каждого Скрипт из ВсеТегиСкриптНаСтранице Цикл
СодержимоеТегаСкрипт = Скрипт.ТекстовоеСодержимое;
// Здесь можно проверять, содержит ли текст скрипта нужную нам переменную
КонецЦикла;
Важно: ПостроительДОМ чувствителен к валидности HTML. Если верстка на сайте "кривая" (есть незакрытые теги), 1С может выдать ошибку при чтении документа. В таком случае придется искать нужный скрипт как подстроку в общем тексте страницы с помощью функции СтрНайти.
Итак, мы получили текст скрипта, но внутри него десятки строк кода, а нам нужна всего одна конкретная цифра. Разберем несколько подходов к решению этой задачи.
Это самый надежный способ. Мы можем подключить COM-объект VBScript.RegExp и найти нужное число по шаблону. Например, если в коде написано var item_id = 12345;, мы настраиваем регулярное выражение на поиск item_id\s*=\s*(\d+) и легко забираем числовую группу.
Если вы не хотите использовать регулярные выражения, можно обойтись стандартными строковыми функциями 1С: СтрНайти, Сред, Лев, Прав. Выясним позицию уникального текста перед нашей цифрой (например, ищем строку "price":), прибавляем длину этой строки и вырезаем символы до ближайшей запятой или закрывающей скобки. Не забудьте использовать СокрЛП для очистки результата от лишних пробелов.
Часто разработчики сайтов помещают в скрипты целые структуры данных в формате JSON. Например: window.settings = {"id": 123, "val": 500};. В таком случае мы можем вырезать подстроку от первой открывающей фигурной скобки { до последней закрывающей }, а затем прочитать эту строку с помощью штатной функции 1С ПрочитатьJSON. На выходе мы получим удобное соответствие или структуру.
Если страница подгружает данные динамически (например, нужная цифра появляется только после выполнения других скриптов на стороне браузера), обычное чтение исходного кода страницы не поможет. Рассмотрим альтернативу: загрузку страницы в элемент формы Поле HTML документа.
В этом случае платформа 1С использует встроенный движок браузера. После полной загрузки страницы мы можем обратиться к объектной модели документа: Элементы.ИмяПоля.Документ и выполнить необходимые скрипты или получить значения уже инициализированных JavaScript-переменных напрямую в 1С.
Подводя итог, проанализируем ситуацию: для статических страниц идеальным решением будет ПостроительДОМ и последующий разбор текста (через JSON или строковые функции). Для сложных динамических страниц лучше использовать Поле HTML документа с ожиданием рендеринга.