Имя: Пароль:
1C
1С v8
Прочитать сайт и получить таблицу с сайта средствами 1С
0 AF
 
12.04.12
09:41
Есть сайт. Его читаю без проблем. На сайте содержатся данные в таблице, или таблицах. Как это можно прочитать? Желательно перебрать все таблицы страницы сайта, а дальше по содержимому можно уже вычленить нужную инфу...
Полный текст сайта читаю легко:

Функция ПолучитьТекстСайта(Ссылка);
   ПолныйТекстСайта="";
   Сайт = Новый COMОбъект("InternetExplorer.Application");
   Сайт.Visible = Ложь;
   Состояние("Подключение к " + Ссылка);
   Сайт.Navigate(Ссылка);
   Пока Сайт.ReadyState < 4 Цикл
   КонецЦикла;
   Попытка
       ПолныйТекстСайта = Сайт.Document.documentElement.innerHTML;
   Исключение
   КонецПопытки;
   
   Сайт.Quit();
   Возврат ПолныйТекстСайта;
КонецФункции


А вот как оттудова дернуть таблицы...
1 НикДляЗапросов
 
12.04.12
09:44
А "сайт" не может предоставить тебе валюты в удобном виде?
2 AF
 
12.04.12
09:44
При чем тут валюты? Это сайт точно не валют...
3 Wobland
 
12.04.12
09:46
HTML=Новый COMОбъект("HTMLFile");
   HTML.Open("text/html");
   HTML.Write(ф.ПолучитьТекст());
   HTMLDocument=HTML.documentElement.document;
   Table=HTMLDocument.getElementsByTagName("Table");
   obj=Table.Item(1);
   КоличествоСтрок=Цел((obj.cells.length-1)/4);
   Для i=1 По КоличествоСтрок Цикл


мож, из этой недописки полезное для себя извлечёшь
4 AF
 
12.04.12
09:52
Не, отладчиком иду... нет нужного. (((
5 rsv
 
12.04.12
09:54
(0) Курите DOM (динамическая объектная модель)InternetExplorer.
6 rsv
 
12.04.12
09:55
+(5) Речь тута совсем не об 1С .
7 AF
 
12.04.12
10:02
(5) и (6) Я понимаю. Но стоит задача, и ее надо решить. Средствами 1С проще, потому как содержимое таблиц напрямую пишу в справочники 1С.
Да и знаниями зачаточными обладаю только по 1С...
8 AF
 
12.04.12
10:26
Видимо, специалистов решивших эту задачу нет... (((
9 Wobland
 
12.04.12
10:28
(8) я получал с сайта техподдержки список последних версий ПП. только столкнулся с неприятным моментом и... положил обработку в стол
10 AF
 
12.04.12
10:32
Пока роемся в отладчике. Через Сайт.Document.documentElement.innerText получаю голый текст. Что значительно упрощает ситуевину. Уже не надо шариться по тегам, вычленяя нужную инфу. Но блин, таблицу хапнуть удобнее!
11 zak555
 
12.04.12
10:32
огласи ссылку
12 AF
 
12.04.12
10:36
(11) куда ссылку? Где ищу таблицу?
13 alexhtn
 
12.04.12
10:36
Для изучения структуры сайта удобно использовать google chrome.
Там выбираешь "Инструменты" - "Инструменты разработчика".
И используешь код из (3)
14 х86
 
12.04.12
10:36
innerХТМЛ
15 AF
 
12.04.12
10:38
(14) Это об чем?
16 zak555
 
12.04.12
10:39
(12) которая здесь :

Сайт.Navigate(Ссылка);
17 AF
 
12.04.12
10:42
(16) http://dzhid1.bur.msudrf.ru/modules.php?name=terr
Таблица территориальной подсудности. Нужны улицы и номера домов.
18 alexhtn
 
12.04.12
10:44
Table=HTMLDocument.getElementsByTagName("tblTerrList");
19 zzhiraf
 
12.04.12
10:45
сделаю за 500 руб)
20 AF
 
12.04.12
10:46
(19) Все мировые судьи РФ? Согласен!
21 AF
 
12.04.12
10:49
(18) Сорри конечно, а можно полный пример кода?
У меня (3) пока не проходит, ругается на переменную "ф". (((
22 zzhiraf
 
12.04.12
10:49
я про страничку из (17) :)
23 AF
 
12.04.12
10:51
(22) За 500 рублей я ее глядя на экран перепишу... )))) А вот с сайта собрать всех судей, реквизиты для госпошлины, ФИО судьи, адрес... И еще хит, связать территориальную подсудность с КЛАДР...
24 AF
 
12.04.12
10:51
+23 По всем мировым судьям РФ...
25 zzhiraf
 
12.04.12
10:53
Напишите нормальное ТЗ, могу посмотреть...
26 AF
 
12.04.12
11:00
Ну какое там ТЗ... Сайт видел. http://www.sudrf.ru/index.php
Оттуда на мировых судей. Всех по РФ.
Задача, получить справочник мировых судей РФ с реквизитами для оплаты госпошлины
и таблицей территориальной подсудности. Населенный пункт территориальной подсудности соотнести с кодом из КЛАДР, улицу - (если есть) - также. Номера домов - некритично, да и невозможно. Потому как часто пишут: "ул. Петрова - вся".
Справочник многоуровневый.
Округ
Субъект
Город/район
Суды
27 zak555
 
12.04.12
11:05
28 AF
 
12.04.12
11:07
(27) Сенкс! И снова в бой... (((
29 n koretsky
 
12.04.12
11:08
как вариант - парсить исходник страницы. начинать выдирать текст с тега начала таблицы и заканчивая окончанием таблицы. а дальше - парсить ее.
но, это уже совсем как запасной вариант.
30 zak555
 
12.04.12
11:09
(28) напиши админам сайта вопрос : какими параметрами можно получить только то, что нужно
31 AF
 
12.04.12
11:10
(29) Ага, уж проще Сайт.Document.documentElement.innerText получить голый текст и прочитать...
32 zzhiraf
 
12.04.12
11:10
(26) это большая работа. Там куча сайтов, у всех все по разному.
33 AF
 
12.04.12
11:11
(30) Писал, послали лесом ))) Типа "Мы техподдержка, а вам, быдлу, нефиг..."
34 AF
 
12.04.12
11:13
(32) Точно, работа немаленькая... Вот сижу, пишу хотя бы на Приволжский федеральный... Если хотя бы полулогикой 70% вытащить, затем второй логикой еще 20%... А потом девочек сажать, пусть набивают...
35 zzhiraf
 
12.04.12
11:14
Зачем вам все мировые судьи РФ?
36 zak555
 
12.04.12
11:14
(33) положи им сайт тогда
37 AF
 
12.04.12
11:19
(35) Долго объяснять. Нужно.
(36) Не катит. Сайт + человек + 5000 строк в документе. На 1 строку примерно 60 секунд. 5000 минут... Если программно обработать хотя бы 4000 строк...
38 zzhiraf
 
12.04.12
11:21
(37) Желаю удачи в этом не легком деле тогда!
39 alexhtn
 
12.04.12
11:22
Если хочешь вечером могу найти код, который делает похожие действия.
Когда-то делал бота для онлайн игры, так приходилось парсить страницы и сохранять данные в 1с.
40 AF
 
12.04.12
11:24
(38) сам себе желаю.... (((
(39) Очень хочу. Ибо сидеть мне еще с этим ой-ей....(((
41 inspam
 
12.04.12
11:31
Как вариант HTML в XLS - http://s019.radikal.ru/i610/1204/11/b7a232e48558.jpg
42 AF
 
12.04.12
11:32
(41) Т.е получить HTML, сохранить как xls, и перечитать?
43 inspam
 
12.04.12
11:38
(42) Ну это как сделаешь)
44 inspam
 
12.04.12
11:39
Можешь посадить девочек перегонять HTML в XLS)
45 AF
 
12.04.12
11:42
(41) я так не умею. Какой алгоритм?
(44) Изнасилуют. Многократно. Жена убьет. )))
46 inspam
 
12.04.12
11:44
(45)
> я так не умею. Какой алгоритм?
Сохранить страницу в голый HTML и открыть в Excel?
47 AF
 
12.04.12
11:49
(46) тьфу, блин... А что, тоже вариант... Сохранять файл в темп, читать и заполнять... ))) Сенкс, поюзаю, потестю...
48 AF
 
12.04.12
14:07
Еще один вопрос...

   Сайт = Новый COMОбъект("InternetExplorer.Application");
   Сайт.Visible = Ложь;
   Состояние("Подключение к " + Ссылка);
   Сайт.Navigate(Ссылка);
   Пока Сайт.ReadyState < 4 Цикл
             ОбработкаПрерыванияПользователя();
   КонецЦикла;
   ПутьКФайлу = "D:\temp.html";
   Сайт.Document.ExecCommand("SaveAs", Ложь,ПутьКФайлу);
   Сайт.Quit();

Пишет сайт на диск, но спрашивает... Как это отключить?
49 Wobland
 
12.04.12
14:17
(48) в случае с екселем надо применять магию DisplayAlerts. наверняка тут такое же есть
50 Wobland
 
12.04.12
14:18
а ещё можно

Попытка
   http=Новый HTTPСоединение();
Исключение
   Сообщить(ОписаниеОшибки());
КонецПопытки;

Попытка
   http.Получить(, Файл);
Исключение
   Сообщить(ОписаниеОшибки());
КонецПопытки;
51 AF
 
12.04.12
14:22
(49) Нет такой команды. Есть Silent. Ее сделал Ложь. Все равно спрашивает... Падла. (((
52 Wobland
 
12.04.12
14:28
(51) тебе сейчас страницу на диск сохранить? возьми (50) и не парься
53 AF
 
12.04.12
14:32
Ошибка при вызове метода контекста (Получить): Ошибка работы с Интернет:  Couldn't resolve host name
54 Wobland
 
12.04.12
14:40
(53) ну говори уже, что понаписал
55 AF
 
12.04.12
15:18
Да... Скучно. html пишется на диск на ура. Эксель его не открывает...
Ошибка: Типы не совпадают (0)
56 alexhtn
 
12.04.12
19:26
Что-то типа этого должно тебе помочь


       УРЛ = Мир.УРЛ + "game.php?village=" + ЭлементыФормы.МоиДеревни.ТекущиеДанные.Код + "&screen=overview_villages&mode=prod&group=0&type=inc&page=-1";
       ПерейтиНаСтраницу(УРЛ);
       
       table = ЭлементыФормы.ПолеHTML.Документ.all.production_table;
       КодКолонки_Деревня = -1;
       КодКолонки_Усадьба = -1;
       КодКолонки_Призыв = -1;
       Для т = 0 По table.rows(0).Cells().length - 1 Цикл
           Если Найти(СокрЛП(table.rows(0).Cells(т).InnerText), "Деревня") > 0 Тогда
               КодКолонки_Деревня = т;
           КонецЕсли;
           Если СокрЛП(table.rows(0).Cells(т).InnerText) = "Усадьба" Тогда
               КодКолонки_Усадьба = т;
           КонецЕсли;
           Если СокрЛП(table.rows(0).Cells(т).InnerText) = "Призыв" Тогда
               КодКолонки_Призыв = т;
           КонецЕсли;
       КонецЦикла;
       Если КодКолонки_Деревня = -1 Тогда
           Возврат;
       КонецЕсли;
       Если КодКолонки_Призыв = -1 Тогда
           Возврат;
       КонецЕсли;
       Если КодКолонки_Усадьба = -1 Тогда
           Возврат;
       КонецЕсли;
       
       Для т = 1 По table.rows.length - 1 Цикл
           КодДеревни = ИзъятьТекст(table.rows(т).Cells(КодКолонки_Деревня).InnerHTML, "village=", "&amp");
           Деревня = Справочники.МоиДеревни.НайтиПоКоду(КодДеревни);
           
           Если Деревня.Пустая() Тогда
               Продолжить;
           КонецЕсли;
           
           Если Деревня.Офф Тогда
               тУсадьба = table.rows(т).Cells(КодКолонки_Усадьба).InnerText;
               тПоз = Найти(тУсадьба, "/");
               Усадьба_Заполнение = СокрЛП(Сред(тУсадьба, 1, тПоз - 1));
               Усадьба_Вместимость = СокрЛП(Сред(тУсадьба, тПоз + 1));
               Если Усадьба_Заполнение = Усадьба_Вместимость Тогда
                   Если ПустаяСтрока(table.rows(т).Cells(КодКолонки_Призыв).innerHTML) Тогда
                       ПредварительныйСписокУсадьба.Добавить(Деревня);
                   КонецЕсли;
               КонецЕсли;
           КонецЕсли;
       КонецЦикла;
57 FN
 
12.04.12
19:46
(0) тримай:


//Функция возвращает количество элементов table на странице
Функция КоличествоТаблицНаСтранице()
   Возврат IE.Document.getElementsByTagName("table").Length()-1;
КонецФункции

//Функция возвращает ТаблицуЗначений, заполненную данными со страницы
//Каждая нечетная колонка ("Текст1") содержит строку - данные ячейки
//каждая четная колонка ("ХТМЛ1") содержит html-код ячейки
Функция ПолучитьТаблицуСоСтраницы(номерТаблицы=0,об="")
   ТЗ=СоздатьОбъект("ТаблицаЗначений"); //для значений
   стр=об;
   Если ПустоеЗначение(стр)=1 Тогда
       стр=IE.Document;
   КонецЕсли;
   спШирина=СоздатьОбъект("СписокЗначений");
       ТаблицаСДанными=стр.getElementsByTagName("table").item(номерТаблицы);
       ВсегоСтрок=ТаблицаСДанными.rows().Length()-1;
       Для х=1 по ВсегоСтрок Цикл
           СтолбцовВстроке=ТаблицаСДанными.rows(х).Cells().Length()-1;
           Для ш=ТЗ.КоличествоКолонок() по СтолбцовВстроке Цикл
               ТЗ.НоваяКолонка("Текст"+ш);
               спШирина.ДобавитьЗначение(1);
           КонецЦикла;
           ТЗ.НоваяСтрока();
           ПоследняяСтрокаТЗ=ТЗ.КоличествоСтрок();
           Для ш=0 по СтолбцовВстроке Цикл
               текстЯчейки=Строка(ТаблицаСДанными.rows(х).Cells(ш).outerText);
               ТЗ.УстановитьЗначение(ПоследняяСтрокаТЗ,"Текст"+ш,текстЯчейки);
               текстЯчейки=СокрЛП(текстЯчейки);
               Если СтрДлина(текстЯчейки)>спШирина.ПолучитьЗначение(ш+1) тогда
                   спШирина.УстановитьЗначение(ш+1,Мин(СтрДлина(текстЯчейки),40));
               КонецЕсли;
               Продолжить;
               
           КонецЦикла;
       КонецЦикла;
   для ш=1 по спШирина.РазмерСписка() Цикл
           ТЗ.УстановитьПараметрыКолонки(ш,,,,,спШирина.ПолучитьЗначение(ш)*1.25);
       КонецЦикла;    
   //Исключение
       //Сообщить("Ошибка при получении данных! "+ОписаниеОшибки());
   //КонецПопытки;
   Возврат ТЗ;

КонецФункции
58 FN
 
12.04.12
19:49
(48) и не получится - по понятиям безопасности всегда будет интерактивный запрос. Можешь попробовать через v7plus получить как текст и сохранить в хтмл. ну или (57) используй