![]() |
Парсинг html-страницы
Приветствую!
Возникла необходимость отслеживать на сайте фифы доступность билетов. Есть список интересующих матчей, которые нужно мониторить. Алгоритм придумал следующий: 1. Формирую массив MatchName, состоящий из названий необходимых для отслеживания матчей: - Матч 01 - Россия : Саудовская Аравия - Москва «Лужники» - Матч 07 - Аргентина : Исландия - Москва «Спартак» - Матч 11 - Германия : Мексика - Москва «Лужники» 2. Поочередно получаю в NodeList дивы с классом "header" (див внутри первого столбец таблицы) и заглядываю внутрь каждого (через innerText), сверяя название текущего матча с первым элементом массива MatchName: Код:
<div class="header" ng-bind="product.productName">Матч 01 - Россия : Саудовская Аравия - Москва «Лужники»</div> Ключевое - это определить класс "class="categoryBox zeroAvailability" - т.е. если этот класс НЕ "zeroAvailability", то далее кидается алерт. 4. Аналогично пройтись по остальным элементам массива MatchName. Ну в общем, я начал: Код:
Option Explicit Вопросы следующие: 1. Понять не могу в чем ошибка. objNodeList - это NodeList, который представляет собой массив из Element'ов. Почему я не могу получить длину этого массива? 2. Вопрос касательно общего алгоритма... Может быть как-то задачу попроще можно решить или логика моя пойдет? 3. Если возможно, то подскажите, пожалуйста, каким образом можно перемещаться по соседним div'ам (из пункта 3. алгоритма)? Спасибо! |
Цитата:
Цитата:
Цитата:
|
Iska, опять я туплю на таком элементарном... Спасибо!
А Вы не могли бы подсказать каким образом можно сразу по имени класса обратиться к дочерним элементам коллекции этой? К примеру, имеется такая html-структура: +
HTML код:
<div class="row rowBox rowBoxEven" ng-class="{'rowBoxOdd':$odd, 'rowBoxEven':$even}" ng-repeat="product in AD.filteredList track by product.productId">
Код:
Set objNodeList = .document.getElementsByClassName("row rowBox rowBoxEven") Код:
Set objNodeList = .document.getElementsByClassName("row rowBox rowBoxEven") |
Цитата:
Цитата:
Цитата:
|
Iska,
Цитата:
Нашел вот такую тему - там обращаются к ребенку через childNodes: Код:
WScript.Echo .document.getElementsByClassName("row rowBox rowBoxEven").childNodes(3).className Или ключевое в getElementById? Т.е. у getElementById имеется свойство childNodes, а у getElementsByClassName вдруг такого свойства не оказалось? А где можно найти список всех их методов и свойств? А на FirstChild, кстати, также ругается. |
Iska, получается, что, используя VBS, обратиться к детям вообще никак нельзя через getElementsByClassName ? Тогда какой от него вообще прок, если нельзя заглянуть внутрь объекта, который возвращает данный метод??
Блин, ну и каким языком распарсить это? Если взять тот же PS, то там та же песня наверняка вылезет. P.S. Неужели никто никогда не парсил HTML через VBS? :D |
The_Immortal, всё можно, язык тут вовсе не при чём, надо просто документацию копать. Проблема в том, что практически вся вменяемая документация, ранее бывшая на сайтах Microsoft, почила в бозе, а та, что появилась — выглядит как сущее издевательство. У меня, конечно, есть и отдельные документации, но их надо либо искать по сусекам, либо освобождать место для разворачивания локальной справки MSDN. Так что проще взять и тупо воспользоваться каким-либо браузером объектов на соответствующей библиотеке типов.
Цитата:
Можно даже далеко не ходить, а просто двигаться маленькими шажками: Код:
WScript.Echo 1, TypeName(.document.getElementsByClassName("row rowBox rowBoxEven")) Цитата:
Хорошо также смотреть внутрь результирующего сгенерированного html посредством Инспектора/Проводника DOM (F12), разумеется, под IE, и под конкретно той версией IE, под которой будет работать скрипт (у меня Проводник DOM не работает, отваливается). Возвращаясь к этому: Цитата:
Цитата:
|
Iska,
Цитата:
И, кстати, Код:
.document.getElementsByClassName("row rowBox rowBoxEven").item(0) Код:
.document.getElementsByClassName("row rowBox rowBoxEven")(0) Да и child'ы мне похоже вообще не нужны: Цитата:
UPD: что-то я зашел в тупик... Код:
Option Explicit Сначала я подумал, что проблему с прыжком на нужное можно решить так: Код:
For i = 0 to 3 Step 1 ' проходимся по 4-ым "pull-left" Класса родительских два и они разные: Код:
<div class="row rowBox rowBoxOdd" ...> Ну и второй (более, наверное, правильный) подход - позицинироваться относительно текущего элемента: Код:
WScript.Echo Match.NextSibling.NextSibling.NextSibling.className Продублирую HTML-код (упрощенный): +
Код:
<div class="row rowBox rowBoxEven"> Я нахожусь вот тут: Код:
div class="header">Матч 01 - Россия : Саудовская Аравия - Москва «Лужники»</div> Код:
<div class="pull-left"> |
попробуйте то же только в повершел -
Код:
|
Serguei Kouzmine, большое спасибо за труд, но я там почти ничего не понимаю :) Я вообще на финишной прямой и осталось только разобраться каким образом получить className перемещаясь через NextSibling...
Локализую проблему. HTML-код ещё раз: +
Код:
<div class="row rowBox rowBoxEven"> Код:
<div class="header">Матч 01 - Россия : Саудовская Аравия - Москва «Лужники»</div> Код:
WScript.Echo Match.NextSibling.className Код:
WScript.Echo (Match.NextSibling).className Цитата:
|
опишите пожалнйста еще раз текстом задачу кот решаете
WScript это что то о чем некоторым хочется поскоее забыть - продираться через дебри вашего кода чтобы выяснить objective честно не сильно хота. но может быть получится написать с нуля |
|
да вы шутите! - сядьте посидите подумайте и опишите задачу кот вы решаете.
Код:
# based on: http://forum.oszone.net/thread-334713.html Код:
|
Serguei Kouzmine, честно попытался разобрать эти
Вот то, что конкретно надо мне, сидит у Вас вот в этих строчках: Код:
$m1 = $documentElement.getElementsByClassName('header') Код:
$e4 = $e3.NextSibling.NextSibling Iska, Вы не могли помочь мне разобраться почему там требуется два прыжка а не один? Это не дает мне покоя. Код:
<div class="row rowBox rowBoxEven"> Дабы мой вопрос был полностью понятен, я сделал демо, которое отражает суть проблемы - кликните и поймете мой затуп :) Почему после первого прыжка у нас имя класса "undefined"??? И откуда при этом тип объекта это Text? Там меж div'ами вообще текста как бы нету. |
успокойтесь пожалуйста - по-моему это аргуляр не всегда то что видишь F12 есть то что он на самом деле рисует/методом проб и ош.
там просто в финальной версии эти отладочные строки типа Код:
$obj.outerHTML |
Цитата:
Короче, проблема там была в том, что меж див'ами сидят всякие пробелы, вот их свойство NextSibling-то и видит. Узрейте разницу: тыц и тыц. А вообще, в моём случае логичнее прыгать через свойство nextElementSibling: тыц ;) Большое спасибо за помощь! |
Цитата:
|
Iska,
Цитата:
|
Цитата:
Если же Вы про IE вообще — так ведь мы пользуем его библиотеки для получения страницы и последующего разбора DOM. Цитата:
|
|
The_Immortal, нынче все браузеры достаточно сблизились в своих трактовках «как оно должно быть». Попробуйте прогнать его под IE 6/7/8. Попробуйте прогнать свой код под IE 6/7/8. Кроме отсутствия свойства .nextElementSibling наверняка не будет и фантомных текстовых элементов.
|
Время: 22:40. |
Время: 22:40.
© OSzone.net 2001-