Тема: VBS: Поиск по странице
Подскажите, в какую сторону копать?
VBS скрипт через IE щелкает странички. Надо осуществить поиск определенного слова на одной из страниц. Как это реализовать?
----
ICQ: 424812203
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Подскажите, в какую сторону копать?
VBS скрипт через IE щелкает странички. Надо осуществить поиск определенного слова на одной из страниц. Как это реализовать?
Через DOM. Поскольку Вы не указали ни URL искомой страницы, ни искомое слово, ничего конкретнее изложенного сказать нельзя.
Через DOM. Поскольку Вы не указали ни URL искомой страницы, ни искомое слово, ничего конкретнее изложенного сказать нельзя.
Спасибо за подсказку. Вот что сделал, получаю html код со страницы, заношу его в text, затем проверяю на наличие символа/строки:
Set objIE = CreateObject("InternetExplorer.Application")
Dim text, result, word
objIE.Visible = False
objIE.Navigate "http://адрес.ру"
While objIE.Busy
WScript.Sleep 200
Wend
Set tag = objIE.Document.documentElement
text = tag.innerHTML
word = "1"
result=InStr(word,text)
MsgBox "Мы нашли слово " & word &" и нашли его " & result & " раз"
Но несмотря на это всегда получаю результат 0, в чем ошибка?
в чем ошибка?
Ваша ошибка в том, что Вы по-прежнему умалчиваете о:
Вы не указали ни URL искомой страницы, ни искомое слово
Гадать о сферическом коне в вакууме не вижу смысла.
Вы не указали ни URL искомой страницы, ни искомое слово
Гадать о сферическом коне в вакууме не вижу смысла.
Хорошо, url http://forum.script-coding.com/
Искомое слово "форум", но прежнему безрезультатно...
Хорошо, url http://forum.script-coding.com/
Искомое слово "форум", но прежнему безрезультатно...
Отнюдь.
Option Explicit
Const READYSTATE_COMPLETE = 4
Dim strUrl
Dim strWord
Dim objIE
strUrl = "http://forum.script-coding.com/"
strWord = "форум"
With WScript.CreateObject("InternetExplorer.Application")
.Visible = False
.Navigate strUrl
Do
WScript.Sleep 100
Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
If InStr(1, .Document.Body.innerText, strWord, vbTextCompare) > 0 Then
WScript.Echo "Text [" & strWord & "] found on Url [" & strUrl & "]."
Else
WScript.Echo "Text [" & strWord & "] not found on Url [" & strUrl & "]."
End If
.Quit
End With
WScript.Quit 0
Результат:
Text [форум] found on Url [http://forum.script-coding.com/].
Теперь по поводу Вашего кода выше.
Кроме свойства «.Busy» надо проверять и состояние свойства «.ReadyState». И иногда (в случае пользования Ajax) — не один раз.
Не вижу необходимости брать свойство «.documentElement». Разве что Вас интересует мета-информация, скрипты и т.п.
К чему Вы берёте свойство «.innerHTML», а не «.innerText» мне также не понятно. Речь вроде бы шла про поиск текста на странице.
Функция «Instr()» работает не так, как Вы предполагаете: она возвращает не число вхождений подстроки, а позицию подстроки, если та найдена. К тому же, если первый необязательный параметр (с какого символа начинать поиск) опущен — поиск идёт двоичный (ибо в этом случае третий параметр тоже опускается) и потому — регистрозависимый. Например, если Вы попробуете поискать слово "серый", то «InStr(1, .Document.Body.innerText, strWord, vbTextCompare) > 0» его найдёт, а вот «InStr(.Document.Body.innerText, strWord) > 0» — нет, поскольку слово «"серый"» встречается там только с заглавной буквы — «"Серый"».
Благодарю за подробный ответ
Ну, как — теперь получилось?
Подскажите пожалуйста, как вместо
WScript.Echo "Text [" & strWord & "] found on Url [" & strUrl & "]."
Просто произвести .click на ту найденную ссылку?
... Просто произвести .click на ту найденную ссылку?
Если имеется в виду, что нужно кликнуть ссылку, текст которой содержит искомое слово, то потребуется в цикле перебрать все ссылки на странице (тэги <a> DOM), и, у каждой проверяя вхождение искомого слова в содержимое её текстого узла, дойти до нужной и применить метод .click():
sSample = "Главная"
For Each oTag in oIE.Document.GetElementsByTagName("a")
If Instr(1, oTag.innertext, sSample, vbTextCompare) > 0 Then
oTag.Click
Exit For
End If
Next
Этот вариант я и пробовал. Но как сделать, чтобы действие click повторялось несколько раз подряд с разными WScript.Sleep между click.
Этот вариант я и пробовал. Но как сделать, чтобы действие click повторялось несколько раз подряд с разными WScript.Sleep между click.
sSample = "Главная"
For Each oTag in oIE.Document.GetElementsByTagName("a")
If Instr(1, oTag.InnerText, sSample, vbTextCompare) > 0 Then
oTag.Click
Do While Rnd < .9
WScript.Sleep 100 + Rnd * 2000
oTag.Click
Loop
Exit For
End If
Next
Огромное спасибо, похоже это наилучший вариант. Но, получаю ошибку.
Сайт открывает нормально, по первой ссылке переходит без проблем, а вот при втором переходе получаю ошибку (Разрешение отклонено: 'Click', 800A0046):
Вот такой вариант кода использую:
Dim strUrl, oIE, oTag
strUrl = "http://forum.script-coding.com/"
Set oIE = CreateObject("InternetExplorer.Application")
oIE.Visible = True
oIE.Navigate strUrl
WScript.Sleep 5000
For Each oTag in oIE.Document.GetElementsByTagName("a")
If InStr(1, oTag.href, ".php") > 0 Then
oTag.Click
Do While Rnd < .9
WScript.Sleep 100 + Rnd * 9000
oTag.Click
Loop
Exit For
End If
Next
Подобная ошибка будет возникать, если в результате "щелчка" по ссылке происходит переход на новую страницу (а, например, не выполнение js). В этом случае необходимо каждый раз после "щелчка" дожидаться готовности загружаемой страницы, находить интересующую ссылку заново и "щелкать".
Спасибо.
А в этом же скрипте возможно такое сделать? Ожидание загрузки страницы я выставил с запасом.
Это как-то так нужно?
Dim strUrl, oIE, oTag
Set WshShell = WScript.CreateObject("WScript.Shell")
strUrl = "http://forum.script-coding.com/"
Set oIE = CreateObject("InternetExplorer.Application")
oIE.Visible = True
oIE.Navigate strUrl
WScript.Sleep 5000
Do While Rnd < .9
For Each oTag in oIE.Document.GetElementsByTagName("a")
If InStr(1, oTag.href, ".php") > 0 Then
WScript.Sleep 9900 + Rnd * 2000
oTag.Click
Exit For
End If
Next
Loop
А в этом же скрипте возможно такое сделать?
Мы этот вариант обсуждаем в соседней ветке, или я чего-то не понимаю? Может, всё же речь про то, как переходить по ссылкам одной страницы?
... Мы этот вариант обсуждаем в соседней ветке, или я чего-то не понимаю? ...
cyber54245, во избежание путаницы предлагаю дальнейшее обсуждение Вашего вопроса вести в более новой ветке http://forum.script-coding.com/viewtopic.php?id=10341. Соберите всё, что у Вас накопилось на данный момент, опубликуйте код скрипта(-ов), опишите что работает не так, какие вываливаются ошибки.
Готово, описал всё в:
http://forum.script-coding.com/viewtopi … 734#p90734
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться