|
Разбор 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КакТекст Ответ=СтрЗаменить(Ответ," "," "); Чтение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-файл. Какой на фиг эксель?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |