ЭлементБлокHTML Как получить дочерние узлы подчинённые только текущему элементу? #710415


#0 by artist
Делаю парсинг сайта, код примерно такой: Пример кода сайта, который соответствует ТекСтрока: <td width="100"> <a href="ССЫЛКА НА ТОВАР"> <img class="short_img" src="какая-то картинка..."> </a> <a class="short_style" href="ССЫЛКА НА ТОВАР"> <font face="Impact">9390 руб.</font> <td class="small" align="right" heigth="2" colspan="5">в наличии - 4</td> Собственно вопрос, как получить только элементы подчинённые ТекСтрока (т.е. только ячейки текущей таблицы)? Или может ПостроительDOM не лучший вариант? Что сейчас кошерно использовать для парсинга сайтов? Ещё на всякий случай, сейчас: А мне нужно что бы было = 3 ЗЫ 8.2.18.109 , но это не принципиально, могу и последнюю 8.3 использовать... ЗЗЫ Обычные формы.
#1 by Котокот
АйдишникДива = ТекДив.Атрибуты.ПолучитьИменованныйЭлемент("id"); - это неправильно, поэтому и не работает
#2 by artist
В чём неправильность? Данный код получает атрибут тэга, в частности id, дальше значение этого атрибута я сравниваю с нужным: .... И только этот див (ТекДив) обрабатываю... Пробовал сделать так: ДокументHTML.ПолучитьЭлементПоИдентификатору("p_list") - ничего не находит...
#3 by Поpyчик-4
Я парсил некий сайт с упорото блочной cтруктурой HTML, построенной на div и как ни странно, алгоритм близко похожий на мой. Использовал ПостроительDOM, вся работа заняла примерно два рабочих дня чистого времени. Большая часть ушла на восстановление подзабытых знаний. зы перед парсингом страницы, я предварительно программно вычищал из неё ненужное, потом приводил имена классов css к идентификаторам, чтобы потом использовать соответствующие методы. Кусок из обработки         СтрокаHTML = СтрЗаменить(СтрокаHTML, "<div class=""b-catalog-table"">", "<div class=""b-catalog-table"" id=""b-catalog-table"">");
#4 by artist
Ну да... Смысл тот же... Спасибо на добром слове... Я со своей проблемой практически разобрался... У меня не .ДочерниеУзлы выдавало лишние элементы, а ТекДив.ПолучитьЭлементыПоИмени("tr") Похоже этот оператор получает все теги с указанным именем ниже текущего элемента, включая вложенные таблицы... Переделал этот код на ТекДив.ДочерниеУзлы[1].ДочерниеУзлы[0].ДочерниеУзлы теперь всё работает. Понимаю что коряво, но похоже сайт на более-менее нормальном движке, и на каждой странице такая закономерность прослеживается, так что пока пойдёт... Теперь у меня другая проблемка нарисовалась. На сайте некоторые страницы подгружаются при скролле до конца страницы (при помощи JavaScript'a). Я это обошёл - добавил на форму ПолеHTMLДокумента, гружу нужную страницу в него, при помощи ЭлементыФормы.Сайт.Перейти(НужнаяСсылка); Добавил программный скроллинг, и после последнего скроллинга (после подгрузкий всей страницы) по таймауту в несколько секунд вызываю процедуру парсинга загруженной страницы. Получаю код HTML с ПоляHTML при помощи Но! Оказывается, что текст содержит только первую версию сайта (без динамически подгруженных данных). Почему такое может быть? Как получить HTML код того, что в данный момент отображается в ПолеHTMLДокумента на форме?
#5 by artist
ЗЫ Процедуру парсинга вызываю не напрямую - типа ПарсингСтраницы а через ПодключитьОбработчикОжидания("ПарсингСтраницы",5,Истина); Т.е. за 5 секунд страница точно вся загружена, и только после этого я начинаю анализировать код страницы... Можно ли как-то из COMОбъекта (ЭлементыФормы.Сайт.Документ) получить полный текст страницы? Возможно там есть обновлённые данные...
#6 by artist
Догадка подтвердилась, COMОбъект содержит все данные... надо как-то вытянуть из него HTML код...
#7 by Котокот
Да, наверное это я затупил, прошу прощения
#8 by Котокот
А зачем COMОбъект, DOM со всем этим вполне справляется.
#9 by artist
Насколько я понимаю: что бы получить DOM-объект - надо откуда-то взять HTML-код - либо загрузить с определённой страницы сайта, либо открыть из файла, либо задать явной строкой из памяти. Или у ПолеHTMLДокумента есть прямой доступ к DOM-модели? Посмотрел в СП, нашёл только это: Свойства: В свою очередь Документ имеет свойство COMОбъект, свойства и методы которого описаны тут: Но что-то я не нашёл там возможности получить исходный код страницы... Как-то это странно.
#10 by artist
+ Сейчас, что бы получить DOM я делаю так: ЧтениеHTML = Новый ЧтениеHTML; ...ну и дальше пошёл стандартный перебор как в постах выше... Где ЭлементыФормы.Сайт = ПолеHTMLДокумента... И вот в этом месте текст содержит не все загруженные данные, в отличии от COMОбъекта... Есть ли какой-нибудь другой способ получить DOM или текст отображаемого сайта?
#11 by Котокот
Так дождаться загрузки страницы. У поля HTML есть же  метод ПриЗагрузке, или как он там точно называется.
#12 by artist
Так дождался... У поля HTML есть событие ДокументСформирован Проблема в том, что это событие вызывается только один раз, при первой полной загрузке страницы. При динамической подгрузке содержимого страницы (полагаю что на сайте используется JavaScript+ajax) это событие не срабатывает...
#13 by artist
+ Но я обошёл это таким образом: т.е. по событию onpropertychange подключаю скроллинг, и в конце ставлю таймаут на процедуру ПарсингТоваров. Т.е. Процедура ПарсингТоваров вызовется через 5 секунд после последней итерации подгрузки страницы... Но, видимо 1Сный объект не обновляет свои данные после того, как страница была полностью сформирована... В отличии от COMОБъекта, который содержит все текущие данные отображаемые в поле...
#14 by artist
Апну с надеждой...
#15 by artist
Если кому будет интересно - можно получить текст через ком при помощи ЭлементыФормы.ПолеХТМЛ.Документ.body.innerHTML или ЭлементыФормы.ПолеХТМЛ.Документ.body.outerHTML
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С