Имя: Пароль:
1C
Админ
Разбор html
0 Мэс33
 
13.06.13
16:21
Всем привет, вот такой вопросик.

Написал на коленке обработку, которая вытягивает с http://www.salyk.gov.kz/ru/Pages/findtaxpayers.aspx некий результат в виде html-файла.

Мне нужно ответ пропарсить и вытащить данные из таблицы, которая возвращается по запросу на том сайте.

Как это правильно сделать?
1 Мэс33
 
13.06.13
16:22
Вот кусок ответа:

       <table class="resultsRNN columnsAuto" style="width: 100%!important; table-layout:auto">
           <col width="15" />
           <col width="90" />
           <col width="25" />
           <col width="55" />

           
               <col width="80" />
           

           <col width="80" />
           <col width="60" />
           <col width="60" />
           <col width="80" />

           

           <col width="130" />

           <thead>
               <tr>
                   <td style='vertical-align: middle'>
                       №
                   </td>
                   <td style='vertical-align: middle'>
                       Наименование
                   </td>
                   <td style='vertical-align: middle'>
                       Тип
                   </td>
                   <td style='vertical-align: middle'>
                       Резидент РК
                   </td>

                   
                       <td style='vertical-align: middle'>
                           РНН
                       </td>
                   

                   <td style='vertical-align: middle'>
                       ИИН
                   </td>
                   <td style='vertical-align: middle'>
                       Дата гос. регистрации
                   </td>
                   <td style='vertical-align: middle'>
                       Дата снятия с учёта
                   </td>
                   <td style='vertical-align: middle'>
                       Причина снятия с учёта
                   </td>

                   

                   <td style='vertical-align: middle'>
                       Дополнительные сведения
                   </td>
               </tr>
           </thead>
           <tbody>
               
                       <tr>
                           <td class="complKnowlege" style="vertical-align:middle;">
                               1
                           </td>
                           <td class="complKnowlege" style="vertical-align:middle;">
                               КРАСНОПОЛЬСКАЯ АЛЕКСАНДРА НИКОЛАЕВНА
                           </td>
                           <td style="vertical-align:middle;">
                               ФЛ
                           </td>
                           <td style="vertical-align:middle;">
                               Да
                           </td>
                               
                           
                               <td style="vertical-align:middle;">
                                   600420278273
                               </td>
                           

                           <td style="vertical-align:middle;">
                               860813402259
                           </td>
                           <td style="vertical-align:middle;">
                               12.08.2004
                           </td>
                           <td style="vertical-align:middle;">
                               
                           </td>
                           <td class="complKnowlege" style="vertical-align:middle;">
                               
                           </td>

                           

                           <td class="complKnowlege" style="vertical-align:middle;">
                               
                           </td>
                       </tr>
                   
           </tbody>
       </table>


--- нужно получить Таблицу значений :-)
2 rull9ss
 
13.06.13
16:24
а вытягивать результат в виде xml не вариант?
3 Мэс33
 
13.06.13
16:24
Сервис не возвращает xml. Только html страничку.
4 arsik
 
гуру
13.06.13
16:24
(0) ПолеHTMLДокумента
5 Мэс33
 
13.06.13
16:25
Не, я примерно теорию знаю.. Мне бы подсказать.
То ли весь DOM обходить, если да - то как ?
Или считывать файл как простой текст.. и парсить ...хм.... поиском по части кода?
Подскажите.
6 Мэс33
 
13.06.13
16:28
Могу на почту выслать файл-ответа. Или попробуйте сами задать поиск по РНН: 600420278273 (пример.. не злоупотреблять)
7 Asmody
 
13.06.13
16:31
см. XPath
8 Wobland
 
13.06.13
16:31
какой-то кусок чего-то у меня вот есть

   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 По КоличествоСтрок Цикл
9 WhiteCat
 
13.06.13
16:32
ДокументHTML (HTMLDocument)

Получаешь в нем твою таблицу в виде узла ДокументHTML.ДочерниеУзлы (HTMLDocument.ChildNodes)
ДокументHTML (HTMLDocument)
ДочерниеУзлы (ChildNodes)

В этом узле объект ЭлементТаблицаHTML (HTMLTableElement)
внутри которого коллекция ЭлементСтрокаТаблицыHTML (HTMLTableRowElement), внутри каждого элемента которой своя коллекция ЭлементЯчейкаТаблицыHTML (HTMLTableCellElement)

Ну а дальше мать-природа тебе поможет.
10 Мэс33
 
13.06.13
16:38
(7) Вот это я читал. А как применить XPath? Было бы к примеру идеально найти по пути типа:
<table class="resultsRNN columnsAuto" style="width: 100%!important; table-layout:auto">  / <thead> / <tr> / <td style='vertical-align: middle'>

(9) Мать-природа не сильно одарила меня навыками чтения HTML. (8) Там этих <table ....> больше 10 штук.
11 WhiteCat
 
13.06.13
16:40
(10) Ну там в принципе все просто, HTML-документ - это суть дерево, сначала основной элемент, внутри него коллекция таблиц, внутри каждой таблицы коллекция строк, далее коллекция ячеек, в которых хранятся нужные тебе данные. Тот же XML по сути.
12 Мэс33
 
13.06.13
16:42
(11) Я это понимаю. Подарите мне кусок кода для указанного выше примера.
При условии, что этих <table ...> больше 10 штук.
13 Mashinist
 
13.06.13
16:44
Я за регулярные выражения
   Рег = Новый COMОбъект("VBScript.RegExp");
14 Мэс33
 
13.06.13
16:46
(13) Отлично. А как в применении к примеру?
15 WhiteCat
 
13.06.13
16:46
(12) Ога, поднимал я тут несколько дней назад этот вопрос: где взять примеры кода для работы с ДокументHTML - нет таких примеров еще. В типовых надо искать.
16 arsik
 
гуру
13.06.13
17:04
(15) на инфостарте есть примеры как парсить HTMLDocument
17 Мэс33
 
13.06.13
17:04
В общем, будем копать.
18 arsik
 
гуру
13.06.13
17:06
19 Asmody
 
13.06.13
17:41
вот кусок разбора

   Ответ=HTTP.Post(URI, Парам, Истина);
   
   ЧтениеXML = Новый ЧтениеXML;
   ПараметрыЧтенияXML=Новый ПараметрыЧтенияXML(
           , //Версия
           , //Язык
           , //ПробельныеСимволы
           ТипПроверкиXML.НетПроверки, //ТипПроверкиПравильности
           Истина, //ИгнорироватьОбъявлениеXML
           Истина, //ИгнорироватьТипДокумента
           Истина, //ИгнорироватьИнструкцииОбработки
           Истина, //Параметры.ИгнорироватьКомментарии
           Истина, //Параметры.ИгнорироватьПробельныеСимволы
           Истина); //СекцииCDATAКакТекст
       
   Ответ=СтрЗаменить(Ответ,"&nbsp;"," ");
   ЧтениеXML.УстановитьСтроку("<root>"+Ответ+"</root>",ПараметрыЧтенияXML);
   ПостроительDOM=Новый ПостроительDOM;
   ДокументDOM=ПостроительDOM.Прочитать(ЧтениеXML);
   
   СтрокаXPath="/root/div[3]/div/div[1]/table/tr[count(td)=2]";
   РазыменовывательПИ = ДокументDOM.СоздатьРазыменовательПИ(ДокументDOM.ПервыйДочерний);
   ВыражениеXPath=ДокументDOM.СоздатьВыражениеXPath(СтрокаXPath, РазыменовывательПИ);
   РезультатXPath=ВыражениеXPath.Вычислить(ДокументDOM.ПервыйДочерний, ТипРезультатаDOMXPath.УпорядоченныйИтераторУзлов);
   Пока Истина Цикл
       ЗначениеXPath=РезультатXPath.ПолучитьСледующий();
       Если ЗначениеXPath=Неопределено Тогда
           Прервать;
       КонецЕсли;
       Если ЗначениеXPath.ИмяУзла="tr" Тогда
           Параметр=СокрЛП(ЗначениеXPath.ДочерниеУзлы[0].ПервыйДочерний.ЗначениеУзла);
           ЗначениеПараметра=СокрЛП(ЗначениеXPath.ДочерниеУзлы[1].ПервыйДочерний.ЗначениеУзла);
           Если Параметр="Статус груза" Тогда
               _СтатусГруза=Новый Структура("Ошибка,Статус,ДатаСдачи,ДатаПрибытия,ДатаВыдачи");
               _СтатусГруза.Ошибка=Ложь;
               _СтатусГруза.Статус=ЗначениеПараметра;
           ИначеЕсли Параметр="Дата сдачи груза" Тогда
               _СтатусГруза.Вставить("ДатаСдачи", СтрокуВДату(ЗначениеПараметра));
           ИначеЕсли Параметр="Время прибытия" Тогда
               _СтатусГруза.Вставить("ДатаПрибытия", СтрокуВДату(ЗначениеПараметра));
           ИначеЕсли Параметр="Дата выдачи" Тогда
               _СтатусГруза.Вставить("ДатаВыдачи", СтрокуВДату(ЗначениеПараметра));
           КонецЕсли;    
       КонецЕсли;
   КонецЦикла;
20 Вик72
 
13.06.13
17:58
(0) Открывай html при помощи Excel через COM. Он сам преобразует html в таблицу, а из Excel ТЗ вытащить - тривиально.
21 Мэс33
 
14.06.13
06:53
(19) Так, надо покурить это дело. Спасибо.
(20) Кстати, не догадался бы :-). Это действительно так. Но скорость падает.

Ведь моя задача такая:
по РНН вытащить у контрагентов их БИНы/ИИНы. Сейчас моя обработка работает со скоростью 1-2 секунды - именно столько времени уходит, чтобы отправить запрос и получить ответ. Плюс я делаю паузу 1 секунду между запросами.
А таких контрагентов несколько сотен тысяч. Если открывать через Excel скорость сильно упадет, да еще там ошибки выходят при открытии.
22 Serginio1
 
14.06.13
10:42
(21) F ЧтениеHTML = Новый ЧтениеHTML;
ПостроительDOM = Новый ПостроительDOM;
Уже предлагали?
23 Мэс33
 
14.06.13
10:51
(22) Предлагали. Дык - это я сам уже понял.
А непонятно как правильно обойти все дерево DOM.
24 Serginio1
 
14.06.13
11:27
Ну наверное
ЭлементыHTML = ДокументDOM.ПолучитьЭлементыПоИмени("table");
25 WhiteCat
 
14.06.13
13:49
(23) Блин, да так же, как обычное дерево значений или XML-файл. Какой на фиг эксель?
Закон Брукера: Даже маленькая практика стоит большой теории.