Имя: Пароль:
1C
1С v8
Парсинг сайта средствами 1С
0 alexsandrinia
 
20.05.15
10:51
Как осуществить извлечение нужной информации с сайта путём 1С?
Подскажите пошаговую инструкцию. Правильно ли я понимаю, что сначала сайт сохраняется по указанному мною пути и потом из сохранённого сайта ищется информация?
1 KrabCore
 
20.05.15
10:54
http://catalog.mista.ru/public/261354/ думаю тебе более чем хватит
2 alexsandrinia
 
20.05.15
10:55
(1) я хочу сам научиться, понять смысл где что происходит.
3 Звездец
 
20.05.15
11:10
ну так скачай, посмотри, задай конкретные вопросы
4 sapphire
 
20.05.15
11:17
(0)
Включить мозг;
Получить страницу с сайта в виде текста;
Вставить первой строкой текст:<?xml version="1.0"?>

Если включить мозг = Истина Тогда
   разобрать документ средствами xml
КонецЕсли;
5 ДенисЧ
 
20.05.15
11:18
(4) Не все html являются xml-валидными
6 DmitrO
 
20.05.15
11:27
ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.ОткрытьФайл(ИмяHTMLФайла);
ПостроительDOM = Новый ПостроительDOM;
ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);

и вперед шариться в ДокументHTML как через DOM модель.
7 alexsandrinia
 
20.05.15
11:30
(6) ИмяHTMLФайла предварительно скачать нужно?
8 DmitrO
 
20.05.15
11:31
(7) да, например через HTTPСоединение
9 alexsandrinia
 
20.05.15
11:33
(8) Соединение = Новый HTTPСоединение(Сервер);
а дальше как сохранить?
10 DmitrO
 
20.05.15
11:36
ИмяHTMLФайла = ПолучитьимяВременногоФайла();
Соединение.Получить("http://ya.ru";, ИмяHTMLФайла);
11 DmitrO
 
20.05.15
11:39
(10)не так, сори, не оттуда скопипастил :)
12 dk
 
20.05.15
11:40
можно без сохранения страницу парсить
13 alexsandrinia
 
20.05.15
11:41
(12) как?
14 DmitrO
 
20.05.15
11:41
(10)+ короче лениво мне декомпозицию кода делать HTTPЗапрос создай
15 dk
 
20.05.15
11:44
я вот эту поделку переделывал
http://catalog.mista.ru/public/88106/
16 alexsandrinia
 
20.05.15
11:50
(15) да, я её смотрел. но тут страница на форму прогружается - получается, тратится на это память?
17 Serginio1
 
20.05.15
11:54
18 DmitrO
 
20.05.15
11:54
(15)ПолеHTMLДокумента - это немного другая песня..
я бы даже сказал что это уже не просто песня это песня с танцем. (замечание по ходу: до 8.3.6 танец будет с бубном).
И я бы не сказал что это "без сохранения".
19 DmitrO
 
20.05.15
11:56
(6) можно сделать на сервере, а (15) это только на клиенте.
20 dk
 
20.05.15
12:00
зато не паришься с контекстом
например корзину с инет магазина попробуй по другому распарсить
21 vde69
 
20.05.15
12:06
примерно так


        ЧтениеHTML = Новый ЧтениеHTML;
        ЧтениеHTML.ОткрытьФайл(ПутьДляСохранения, СокрЛП(Площадка.Кодировка));
        ПостроительDOM = Новый ПостроительDOM();
        мДок = ПостроительDOM.Прочитать(ЧтениеHTML);
        ТекущийПуть = "";
        
        Попытка
            а = мДок.Тело.ДочерниеУзлы;
        Исключение
            Сообщить("Ошибка при чтении результата поиска", СтатусСообщения.Важное);
            Параметры.Вставить("ТекстЛога", ТекстЛога);
            Если не НеОстанавливатсяПриОшибках Тогда
                Возврат;
            КонецЕсли;
        КонецПопытки;
        
        Если ВестиЛог Тогда
            ТекстЛога = ТекстЛога + " - ОК";
        КонецЕсли;
        
        Если ВестиЛог Тогда
            ТекстЛога = ТекстЛога + "
                | > поиск ссылок на лоты на странице: " + Соединение.Сервер    + "/" + ПараметрыСтроки.ПутьНаСервере;
        КонецЕсли;
        
        // ---------------------------------------------------------------------------------
        // парсинг одной страницы результата поиска
        Обработчики = Новый Соответствие;
        Для Каждого эл из Площадка.ОбработчикиСписка Цикл
            Обработчики.Вставить(эл.Тег, эл.Обработчик);
        КонецЦикла;
        
        СтароеКоличество = Результат.Количество();
        СтарыйРезультат = Результат.ВыгрузитьКолонку("URL");
        
        ТекущийУровень = 0;
        ТекущийПуть = "";
        Для каждого ДочернийУзел Из мДок.Тело.ДочерниеУзлы Цикл
            ОбработатьУзелРекурсионно(ДочернийУзел, ТекущийПуть, ТекущийУровень, Обработчики, Результат);
        КонецЦикла;  
        
        // исключаем из пути URL
        мХост = СокрЛП(ПараметрыСтроки.Хост);
        мДлина = СтрДлина(мХост);
        Для Каждого эл из Результат Цикл
            мНач = Найти(эл.URL, мХост);
            Если мНач > 0 Тогда
                эл.URL = Сред(эл.URL,мНач+мДлина);
            КонецЕсли;
        КонецЦикла;
        
        Результат.Свернуть("URL","");
        
        Если ВестиЛог Тогда
            Для Каждого эл из Результат Цикл
                Если СтарыйРезультат.Найти(эл.URL) = Неопределено Тогда
                    ТекстЛога = ТекстЛога + "
                        | >>>> " + эл.URL;
                КонецЕсли;                      
            КонецЦикла;
        КонецЕсли;
        
        Если не ПоСтранично Тогда
            Прервать;
        Иначе
            ТекущаяСтраница = ТекущаяСтраница + 1;
            Если СтароеКоличество = Результат.Количество() Тогда
                Прервать;
            КонецЕсли;
        КонецЕсли;
        
        Если ТекущаяСтраница > 9999 Тогда
            Сообщить("Аварийный выход из цикла, слишком много данных", СтатусСообщения.Важное);
            Прервать; //аварийный выход
        КонецЕсли;
22 DmitrO
 
20.05.15
12:14
(20)ну это да, смотря для чего мы это парсим, и что не мало важно, смотря что мы парсим.
Возможно даже применение комплексного подхода: используя ПолеHTMLДокумента интерактивно переходим на сайт, проходим авторизацию (все java-события и прочие редиректы отрабатывают штатно на клиенте), потом выдергиваем нужные данные из DOM-объекта элемента управления для целевого запроса, делаем программный запрос через НТТPСоединение, получаем файл, отправляем его на сервер, и там парсим раскладывая данные уже по своей базе.