Парсер в 1с это
Парсер сайта через 1с
Всем привет! Делаю парсер сайтов под 1с 8.2 Загружаю страницу с кнопку на ПолеHTMLДокумента1 .
Как лучше реализовать парсер HTML/XML, CSS, JavaScript?
Пишу свою интегрированную среду разработки для HTML, CSS и JavaScript. Считаю необходимым.
Запись XML-дерева сразу в xml-файл (парсер JAXP)
Народ!Программеры!Помогите человеку,плиз! Парсерю я xml-файл,через DOM-модель,использую JAXP.После.
Возможность вызова функции через XML-RPC из HTML/JavaScript
Здравсвуйте, Вопрос: Возможен ли вызов функции через XML-RPC из HTML/JavaScript. Подробнее.
Live4Sky, я бы вам не рекомендовал разбираться с парсингом сайтов, сначала разберитесь с обычными и управляемыми формами, если для вас проблема перевести форму из одного вида в другой.
Не по теме:Live4Sky, я бы вам не рекомендовал разбираться с парсингом сайтов, сначала разберитесь с обычными и управляемыми формами, если для вас проблема перевести форму из одного вида в другой. хм. лучше бы посоветовали как html в xml запихнуть..и с формами у меня не особо проблемы..просто это задание,кто то его дал и сказал написать вот именно так..одно дело для себя,другое "курсовая работа" Да любой в принципе..суть проекта такова:берется веб - страница,с помощью средств 1С загоняется в xml дальше идет парсинг xml. как только встретил ссылку на другую страницу,переходит по ней,процедура повторяется..(html->xml->parse xml) собственно вот как парить xml,я нашел и вроде как разобрался. а вот как из html xml получить пока не могу понять(( .а вот как из html xml получить пока не могу понять(( Эммм..но ведь лучше парсить сразу xml..удобнее просто страницу сразу получить в xml формате и от нее плясать или что то я недогоняю(? ВНЕЗАПНО - никто не гарантирует что ты из хтмл получишь коректный хмл.
Прежде чем вещать - - ознакомтесь с задачей и используемой технологией внимателнее. И уже после этого - полюбите ЧтениеHTML
wwall, вот так появляются проекты (Журнал оператора ЕРП и т.д.)
Добавлено через 22 секунды
Live4Sky, думаешь все сайты имеют одинаковую структуру?
wwall, вот так появляются проекты (Журнал оператора ЕРП и т.д.)
Добавлено через 22 секунды
Live4Sky, думаешь все сайты имеют одинаковую структуру?
думаю,что кое что я упустил в задании. и вот что:парситья будет не любой сайт,сайты с объявлениями типа (avito),и я думаю,что у таких сайтов структура более или менее одинаковая..
Добавлено через 2 минуты
Насчет проблем - с чтением html - на твоем уровне работать работать проще, чем с хмл.
А что касается задачи в целом - открой для нимфосрать. там подобного гуано лежит - многие тонны.
при отладке ошибка.
Предположим что у тебя ломаная версия 1С в которой нет в комлекте синтаксис помощника.Официальное описание метода от православного СП такое -
ЧтениеHTML (HTMLReader)
ОткрытьФайл (OpenFile)
Синтаксис:
ОткрытьФайл(<ИмяФайлаHTML>, <ТипКодировки>)
Параметры:
Тип: Строка.
Имя файла, содержащего текст HTML.
<ТипКодировки> (необязательный)
Открывает HTML-файл для чтения данным объектом. Если перед вызовом данного метода уже производилось чтение HTML из другого файла или строки, то чтение прекращается и объект инициализируется для чтения из указанного файла.
Тонкий клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Пример:
ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.ОткрытьФайл("c:/docs/data.xml");
Добавлено через 1 минуту
а то что я.ру пропарсить не можешь. может тебе на кошках потренироваться?
Наверное, любой сотрудник службы маркетинга, имеющий дело с интернет-бизнесом, или аналитик, желающий знать положение своей фирмы на рынке или среди конкурентов, сталкивался с задачей сбора информации на различных сайтах по специфике своего бизнеса.
Обычно цель таких работ – мониторинг цен конкурентов, отслеживание новинок в ассортименте, получение новостей, сбор и аналитическая обработка любой другой информации, не являющейся интеллектуальной собственностью.
Когда за эти задачи берется «не айтишник», это превращается в часы и дни монотонной работы по копированию-вставке однотипной информации с сайтов, что не только само по себе плохо и не эффективно, но еще и приводит к ошибкам – можно вставить повторно одно и то же, случайно затереть или переместить вставленные данные и так далее.
А если эти данные необходимо ввести в 1С и связать с какими-то объектами учета, это требует дополнительных доработок для организации работы пользователя – новые формы, проверки ввода, выполнение нескольких обновлений конфигурации, трата времени на обучение пользователей и т.д.
В современных условиях перехода к цифровизации бизнеса и «четвертой промышленной революции» такой подход, конечно же, является тупиковым, не масштабируемым и не эффективным по всем параметрам. Поэтому необходимо внедрять решения, исключающие человеческий труд, который должен использоваться только для анализа собранных данных и другой «интеллектуальной» работы.
В общемировой практике такие задачи автоматического сбора данных из общедоступных источников существуют со времен появления Интернета и первых поисковых систем. Они называются «парсинг» или «скрапинг», а программы-парсеры можно реализовать на всех популярных языках и платформах. Примеры самых популярных инструментов для парсинга:
Новые возможности в платформе
Начиная с версии 8.3.13 в 1С появились новые функции, упрощающие работу с html-документами, это, в частности, поиск по фильтрам, аналогичный отбору по селекторам в jQuery и перечисленных выше библиотеках. Это позволяет парсить веб-страницы на 1С, применяя всего лишь базовые основы CSS. Не нужно изучать и мучиться с XPath, перебором элементов или полноценно погружаться в веб-фреймворки и незнакомые технологии!
Все новые функции с кратким описанием:
позволяет очистить документ от ненужных элементов, например скриптов, апплетов, фреймов и т.д.
позволяет получить текст внутри какого-либо элемента, без необходимости обходить и получать конкретный тег из структуры вложенных блоков. Идентичен свойству innerText в JavaScript
Функция поиска элементов по селекторам и тегам, основной инструмент парсинга
Удаление элементов по определенным селекторам, можно применять для более гибкой очистки содержимого, если нужно скопировать документ целиком, но без некоторых участков
Пример задачи парсинга
Рассмотрим практический пример задачи извлечения данных. Допустим, мы хотим написать свою конфигурацию для учета инвестиций в акции и другие инструменты. Но вся необходимая информация хранится на разных сайтах или доступна только через REST API. Придется парсить разные источники, чтобы получать данные об инструментах, новостях, показателях компаний и т.д. Преимущество реализации на 1С в том, что мы можем написать несколько парсеров для разных источников и представить сводку в удобном виде, используя преимущества быстрой разработки на 1С – базу данных, конструктор форм и все другие средства.
Блок информации
Селектор
Название акции
О компании
Класс «SecurityInfoPure__info_3Mgld», тег <p> внутри
Сайт компании
Класс «SecurityInfoPure__link_2lmEC», тег <SPAN> внутри него
Логотип компании
Класс «Avatar__image_3KvrS», ссылка в описании стиля: свойство background-image
Здесь заметно, что имена классов имеют суффикс со случайным набором символов, но это мы легко обойдем.
Создадим код для получения текста страницы:
Заголовки = Новый Соответствие;
Заголовки.Вставить("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36");
Запрос = Новый HTTPЗапрос("/invest/stocks/AAPL/", Заголовки);
Соединение = Новый HTTPСоединение("www.tinkoff.ru". Новый ЗащищенноеСоединениеOpenSSL);
Теперь подготовим объект документа для анализа и получения данных:
ЧтениеHTML = Новый ЧтениеHTML;
Построитель = Новый ПостроительDOM;
Дальше сформируем фильтр для передачи в функцию поиска по документу. Фильтр это конфигурация отбора в виде JSON-строки, и у нее есть два корневых элемента – type и value. Есть несколько типов и для каждого - несколько допустимых значений, полное описание вариантов есть в синтаксис-помощнике в разделе «Описание структуры JSON-конфигурации для отбора».
Такую структуру может быть неудобно каждый раз формировать вручную, если парсинг многоступенчатый и сложный, поэтому лучше сразу вынести это действие в отдельную функцию и пользоваться многократно.
В нашем случае – реализуем функцию для формирования фильтра поиска по тегу и классу элемента, для этого нужно выбрать тип «пересечение условий» («intersection») и добавить значение «value» как массив из трех условий – на равенство тега, наличие атрибута «class» и поиск по шаблону для значения атрибута:
Функция СформироватьФильтрПоКлассуТега(Тег, Класс, ТочноеСоответствие = Истина)
ВидПоиска = ?(ТочноеСоответствие = Истина, "valueequals", "valuematchesregex");
ИмяКласс = ?(ТочноеСоответствие = Истина, Класс, Класс+".+");
ПараметрыПоиска = Новый Структура("type,value", "intersection", Новый Массив);
ПараметрыПоиска.value.Добавить(Новый Структура("type,value", "elementname", Новый Структура("value,operation", Тег, "equals")));
Новый Структура("type,value", "hasattribute",
Новый Структура("value,operation", "class", "nameequals")));
Новый Структура("value,operation", ИмяКласс,ВидПоиска)));
Запись = Новый ЗаписьJSON;
Здесь в зависимости от флага «ТочноеСоответствие» используется два варианта отбора – точное равенство или проверка по регулярному выражению. Это позволяет задавать сложные шаблоны поиска селекторов. В нашем случае при неточном соответствии в переменной ИмяКласс помещаем переданное значение и добавляем символы «.+», что означает «1 или более любых символов» после указанного значения.
Теперь мы можем формировать любые фильтры для выбора элементов и извлекать из них информацию. Оформим парсинг в виде функции, возвращающей структуру с полученными данными страницы:
Результат = Новый Структура("Ошибка,Результат", Ложь);
Данные = Новый Структура("ОписаниеКомпании, СайтКомпании, СсылкаНаКартинку");
Фильтр = СформироватьФильтрПоКлассуТега("div","SecurityInfoPure__wrapper_", Ложь);
Если МассивУзлов.Количество() > 0 Тогда
Если Узел.ДочерниеУзлы.Количество() > 1 Тогда
Здесь мы сочетали получение узла по селектору и получение дочерних узлов из DOM-структуры вместо нескольких выборок по селектору. В простых случаях это может быть удобнее.
Парсинг картинок
Теперь рассмотрим пример получения изображения и сохранения его в 1С. Адрес картинки с логотипом компании в нашем случае хранится в стиле внутри тега span и его нужно получать через атрибуты узла.
После этого получим картинку как двоичные данные обычным GET-запросом и сохраним во временное хранилище:
Если МассивУзлов.Количество() > 0 Тогда
Для каждого Атр Из Узел.Атрибуты Цикл
Если Атр.ИмяУзла = "style" Тогда
АдресКартинки = Сред(МассивУзлов[0].Атрибуты[1].ЗначениеУзла, 41);
АдресКартинки = Лев(АдресКартинки, СтрДлина(АдресКартинки)-1);
Соединение = Новый HTTPСоединение("static.tinkoff.ru". Новый ЗащищенноеСоединениеOpenSSL);
Данные.СсылкаНаКартинку = ПоместитьВоВременноеХранилище(Картинка, УникальныйИдентификатор);
Ресайз картинки
Добавим еще один шаг, не относящийся к парсингу, но который поможет при выводе списка ценных бумаг на форме – уменьшим полученное изображение до размера 36*36, чтобы можно было поместить его в динамический список. Для этого используем встроенный в систему компонент «WIA.ImageFile» и его возможности трансформации изображений. Для удобства напишем функцию, которой можно передать, как ранее полученную ссылку на картинку во временном хранилище, так и двоичные данные:
Функция СгенерироватьМиниатюру(СсылкаНаКартинку = "", ДвДанные = Неопределено, УИД)
// сохраняем в файл для обработки
Если ЭтоАдресВременногоХранилища(СсылкаНаКартинку) Тогда
Изобр = Новый COMОбъект("WIA.ImageFile");
ОбработкаИзобр = Новый COMОбъект("WIA.ImageProcess");
// сохраняем рузультат и возвращаем адрес
Возврат ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВрФайл), УИД);
В результате мы получим такой список акций:
Таким образом, мы получили данные из определенных блоков страницы: текст, ссылку и изображение, которые теперь можем использовать для создания объекта «Ценная бумага» и сохранить его в разработанной конфигурации:
О.Картинка = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(
О.КартинкаМал = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(
Дальнейшее развитие парсинга средствами 1С
Парсинг динамических сайтов
Для обхода этой проблемы используются так называемые headless-браузеры, которые могут исполнять скрипты и получать конечный сформированный документ, в node.js это, например, пакеты Nighmare или Puppeeter. Либо можно использовать инструмент для тестирования веб-страниц Selenium.
В 1С есть похожее решение – встроенный браузер в компоненте «ПолеHTMLДокумента», но в таком случае парсинг придется запускать вручную в режиме предприятия.
Можно предположить, что автоматизировать этот процесс можно с применением Vanessa Automation, но пока на практике я это не проверял.
Массированный парсинг
При необходимости обрабатывать большое количество страниц или делать это с определенной периодичностью, можно задействовать механизм регламентных заданий и выполнять сбор информации многопоточно и/или по расписанию. Этот механизм должен использоваться и в случае ограничений у сайта на число запросов – при этом можно сочетать регламентное задание с периодической сменой прокси, создав для их учета отдельный регистр.
Вынос парсера в расширение
Для уменьшения вмешательства в основную конфигурацию предприятия, можно реализовать парсер целиком в виде расширения, создав отдельную подсистему, справочники и регистры для хранения данных.
При необходимости привязки данных к объектам основной конфигурации можно сохранять их в дополнительные реквизиты или реализовывать собственные представления данных в виде обработок или отчетов в расширении.
Заключение
В целом, 1С сделала еще один шаг навстречу миру веб-технологий, хоть и снова своим способом – вместо поддержки выбора элементов напрямую по любым CSS-селекторам, реализовала его через JSON-фильтры, что в принципе можно обернуть в свою функцию-декоратор и использовать на разных задачах.
Есть сайт. На определенной страничке выводится таблица с информацией. Информация тянется из базы средствами ПХП.
и так далее. Я хочу открыть первую страницу, нажать волшебную кнопку и система должна обойти все эти странички. Как реализовать такой обход?!
(4) а это как так? типа в браузере отобразится, а дом-документом не проглотится?(9) это он и есть:
Документ (Document)
Использование:
Только чтение.
Описание:
Тип: COMОбъект. Предоставляет доступ к HTML документу.
Недоступно на сервере 1С:Предприятие. Не используется в модуле внешнего соединения.
Так мне не просто пропарсить нужно! Пропарсить не проблема.
Я найду в тексте ссылку вот эту:
а как мне ее выаолнить?!
Т.е. я беру начальную страницу. Нажимаю кнопочку. 1С-ка парсит страницу, берет нужную инфу с нее. Затем находит ссылку на следующуб страницу (что выше) и переходит по ней. И далее алгоритм повторяется до конца (по всем страница или по ограниченному количеству).
(16) да я знаю про рекурсию!
Ты видишь ссылку, что я показал в примере?
(18) в том и дело! ТАм как-то вот этот параметр должен обрабатываться "pageNum="2""
(17) Посмотри в коде страницы ява-скрипт по классу pag_n. Скорее всего там какой-то обработчик вызывается.
(20) уже смотрел. Явно такого нет. Но там два файла явовских (модуля) подключаются.
(22) не могу - там доступ платный. А доступ к инфе, разумеется, возможен только после аутентификации и оплате.Получить(<Источник>, <ИмяВыходногоФайла>, <Заголовки>)
Параметры:
Тип: Строка.
Указываются заголовки, добавляемые к запросу на сервер. Текстовые пары вида <Заголовок>:<Значение>, разделяемые комбинацией ВК + ПС.
Описание:
критикуйте мой сайт
у меня есть сайт который я создал для того, чтобы донести обществу что есть кучка людей.
Оцените сбору, критикуйте, предлагайте
Дело такое, собрали мне вчера компухтер, прокомментируйте пожалуйста)).
Прежде чем приступим к изменению кода, определим, что требуется от нашего парсера, кроме распознавания символа. Возврат изменой строки – не самое лучшее решение. Ведь дальше, после этапа разбора строки нас будет ожидать этап интерпретации полученного дерева. Требования к функции опишем так
1. В случае успешного сопоставления строки – вернуть разобранный символ и остаток строки
2. В случае неудачного разбора – вернем входную строку.
Простейший способ определить возвращаемые значения – написать функции
И тогда код функции переписывается так
Наверное такой код лучше чем было ранее. По крайней мере понятней. Но можно сделать лучше. Для этого требуется определит 2 простые функции – СоздатьПарсер и РазобратьСтроку
Определим их следующим образом
Добавлено через 13 секунд
«Краткость – сестра таланта» (с) народная мудрость
Давайте посмотрим на наши функции РазобратьСтроку и СоздатьПарсер – вроде бы не плохие функции, понятные и простые. Но давайте подумаем – а что если нам подребуются дополнительные варианты парсеров? Например парсер строки? Или парсер символа без учета регистра? Тогда наша конструкция Если/ИначеЕсли будет расти и сделает код похожим на код одного франчайзи (да, я буду постоянно пинать их код). Применим мозг и шаблон «Pluggable Selector»
Критикуйте, если понравиться - продолжу писать
А я вот даже плюсану.
Я всегда был за такой подход к программированию! Интерфейс программы + кучка служебных функций, после чего добавление нового функционала программы сводиться к описанию функции + добавление функции в интерфейс программы
wwall, не понял одного, посимвольный парсер в 1С это как пример реализации? Добавлено через 4 минутыБлин, не так выразился!
Почему именно ТАК?
Если сред(строка,1,1) = Парсер.Образец Тогда
* * * * Возврат РазобраноУспешно (символ,сред(строка,2));
* * Иначе
* * * * Возврат РазобраноНеудача(строка);
* * КонецЕсли; - вот это парсер. сред(строка,1,1) вернет первый символ. Если он равен символу с которым сравниваем то считается что парсер отработал и тогда возвращаем остаток строки (без первого символа), далее этот остаток будет передан следующему парсеру и так пока либо не кончатся парсеры. Если на выходе пустая строка - то все парсеры отработали корректно и анализируемая строка удовлетворяет всем условиям
Эта функция разбирает слово только слово "мама". Вместо слова "мама" чуть позже будут подставлены слова "ВЫБРАТЬ", "ИЗ" и прочие ключевые слова из языка запроса.
Добавлено через 6 минут
обработка парсера сводиться к обходу массива в функции РазобратьСтроку где каждый элемент массива также является парсером. А для упрощения обработки результата у нас есть 2 функции Успех() и Неудача() - в зависимости от того - как отработал парсер мы определяем дальнейшее поведение. В нормальном языке структура была бы заменена либо типом либо функционалом. Но мы в 1С, ни тип создать, ни замыкание
Ну тогда давай продолжай, уже интереснее становиться.
Добавлено через 3 минуты
пока не совсем догоняю почему на последовательность символов в строке А*n мне нужно парсеров Парсер*n
Добавлено через 2 минуты
----------------------------------------------------------
Далее реализовываем последовательность
Что А должна идти за "М" или За "П", остальное нас не интересует
Думаю что будет интересно - завтра напишу продолжение где опишу дополнительные служебные функции.
Потом еще немного служебных функций на третью часть
Затем еще немного в четвертой части
И только в 5 приступим к парсеру запросов.
Добавлено через 3 минуты
Да. Именно так.
Строка "ааа" - разбирается 3 парсерами "а" вызваными последовательно. Если в итоге пустая строка - то все ок. Если нет - то в остатке - то строка не "ааа" (тут может быть либо "ххх" либо "ууу"). Но в случае если строка переданная для разбора будет "аааа" то результат - успешно разобранная "ааа" и "а" в остатке.
Что А должна идти за "М" или За "П", остальное нас не интересует Вот именно по этому тебя не возьмут работать во франч
Альтернатива - как я понимаю это дополнение к основному парсеру?
Давай мелкий "заголовочек" про альтернативу
Про альтернативу -
Предположим у нас есть парсер распознающий символ "а" и парсер распознающий символ "б", тогда парсер
СоздатьПарсер("|",СоздатьПарсер("match","а"),СоздатьПарсер(" match","б")) распознает либо строку "а", либо строку "б", но не распознает строку "с"
Если абстрагироваться сейчас от разспознавания, а рассматривать парсер символа как функцию которая возвращает истина когда первый символ строки равен указаному и ложь иначе, то альтернатива это логическое "или"
но в нашем случае парсер возвращает не булево, а структуру с признаком типа - успешно или неудачно отработал парсер.
именно для того что бы привести возвращаемое значение к булевому типу и нужны функции Успех() и неудача()
И второе - постороенный на альтернативе парсер прекращает свою работу как только встречает первое успешное вхожднение последовательности в строку. Из этого следует что L-> "мам" | "мама" при входящей строке "мама" разберет "мам", а не "мама", то есть алгоритм у парсера не "жадный" - с одной стороны это проблема (как ее обойти будет показано позже), с другой стороны такое упрощение освобождает от хранения стека прочитаных символов, позволяя заменить его на стек вызовов парсеров.
Добавлено через 5 минут
Ну а определение для функций простое
Читайте также: