|
Парсинг сайта средствами 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Соединение, получаем файл, отправляем его на сервер, и там парсим раскладывая данные уже по своей базе. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |