Что нового

Переход по ссылкам содержащим одинаковые строки - как лучше организовать?

Ocago

Новичок
Сообщения
35
Репутация
0
Доброго времени суток,
Что-то подзавис с простой вроде задачей. :wacko:
Вот пример (часть кода):
Код:
$oLinks = _IELinkGetCollection($oIE)
$hwnd = _IEPropertyGet($oIE, "hwnd")

DIM $sMyString[2]  ;массив слов содержащихся в ссылках, которые искать
$sMyString[0] = "TEXT 1"
$sMyString[1] = "TEXT 2"

For $i = 0 To 1
  For $oLink in $oLinks
	$sLinkText = _IEPropertyGet($oLink, "innerText")
	If StringInStr($sLinkText, $sMyString[$i]) Then
		_IEAction ($oLink, "click")
		ExitLoop
	EndIf
  Next
  Sleep(1000) ; далее конструкция для опознавания и обработки окна, если оно новое - попап
  local $hIEFrame = WinGetHandle ("[CLASS:IEFrame]")
  Sleep(2000)
  WinClose($hIEFrame)
  Sleep(500)
Next


Но, в данном случае - просто находится в первом цикле первое слово - кликается - закрывается потом, следующий цикл - второе слово. Всё.

А как сделать, чтобы если на старнице, которую "обыскиваем" несколько ссылок, содержащих "TEXT 1", к примеру? И надо их все (а луше заданное число таких ссылок обработать)?
А потом так-же со следующим словом из массива.

Всем спасибо за любые задумки и предложения :smile:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Ocago [?]
А как сделать, чтобы если на старнице, которую "обыскиваем" несколько ссылок, содержащих "TEXT 1", к примеру? И надо их все (а луше заданное число таких ссылок обработать)?
У вас стоит функция
Код:
_IEAction ($oLink, "click")

Как же вы собираетесь обработать остальные ссылки? Вы же делаете переход на другую страницу!
Сперва нужно удалить из кода
Код:
_IEAction ($oLink, "click")
ExitLoop

Потом в цикле, собрать в массив или переменную все найденные ссылки, а уже потом что-то с ними делать.
 
Автор
O

Ocago

Новичок
Сообщения
35
Репутация
0
Garrett сказал(а):
Потом в цикле, собрать в массив или переменную все найденные ссылки...

это понятно, что надо убрать "click",
но, вот я и не соображу никак, как именно собрать в массив собираемые циклом ссылки?
Хоть какой-нить примерчик-бы? :-\
А то уже от этих циклов мозх туда-же - в циклы :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Ocago
Попробуйте так:
Код:
#include <IE.au3>
#include <Array.au3>

Dim $aLinks[1][2]
$z = 0
$sUrl = 'http://www.google.ru/search?hl=ru&source=hp&q=autoit&aq=f&aqi=g10&aql=&oq=&gs_rfai='

$oIE = _IECreate($sUrl)
$oLinks = _IELinkGetCollection($oIE)
For $oLink In $oLinks
	If StringInStr($oLink.innertext, 'AutoIt v3') Then
		$z += 1
		ReDim $aLinks[UBound($aLinks) + 1][2]
		$aLinks[$z][0] = $oLink.innertext
		$aLinks[$z][1] = $oLink.href
		$aLinks[0][0] = $z
	EndIf
Next
_ArrayDisplay($aLinks)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Можно ещё вот так:
Код:
#include<IE.au3>
#include<Array.au3>
;~~~~~
For $i = 0 To 1
  For $oLink in $oLinks
    If StringInStr(_IEPropertyGet($oLink, "innerText"), $sMyString[$i]) Then
		$aResult[0] = UBound($aResult)		; записываем в нулевую ячейку количество найденных ссылок
		_ArrayAdd($aResult, $oLink.href)	; добовляем в масив найденные ссылки
    EndIf
  Next
Next
;~~~~~
_ArrayDisplay($aResult)

Однако пример выше более универсальный. Он позволяет наращивать ячейки массива.
Хороший пример madmasles! :ok:
 
Автор
O

Ocago

Новичок
Сообщения
35
Репутация
0
Спасибо всем - отличные примеры :ok:
Теперь ещё выборку освоить надо из полученного массива и всё срастётся :smile:
 
Автор
O

Ocago

Новичок
Сообщения
35
Репутация
0
Garrett сказал(а):
Ocago [?]
Смотря, по каким критериям.

Ну, к примеру, раз клики вынесли из цикла. Получили отдельным массивом пачку ссылок на странице (пусть там 10 будет) - теперь пройти кликами 5 из них (случайно отобрать любые из этих 10, скажем).
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Ocago
Попробуйте так:
Код:
#include <IE.au3>
#include <Array.au3>

Dim $aLinks[1][2]
$z = 0
$sUrl = 'http://www.google.ru/search?hl=ru&source=hp&q=autoit&aq=f&aqi=g10&aql=&oq=&gs_rfai='

$oIE = _IECreate($sUrl)
$oLinks = _IELinkGetCollection($oIE)
For $oLink In $oLinks
	If StringLeft($oLink.innertext, 6) = 'AutoIt' Then
		$z += 1
		ReDim $aLinks[UBound($aLinks) + 1][2]
		$aLinks[$z][0] = $oLink.innertext
		$aLinks[$z][1] = $oLink.href
		$aLinks[0][0] = $z
		If $z = 10 Then ExitLoop ;если нашли 10 ссылок, то выходим из цикла.
	EndIf
Next
_ArrayDisplay($aLinks)
If $aLinks[0][0] < 5 Then
	$j = 1
Else
	$j = $aLinks[0][0] - 4
EndIf
;будем, например, переходить по последним 5-и ссылкам
For $i = $j To $aLinks[0][0]
	_IENavigate($oIE, $aLinks[$i][1])
	;здесь можно что-то сделать на странице,
	;например, если есть фраза AutoIt v3.3.6.1, то записываем текст в файл.
	$sIEBodyText = _IEBodyReadText($oIE)
	If StringInStr($sIEBodyText, 'AutoIt v3.3.6.1') Then
		$hFile = FileOpen(@ScriptDir & '\' & $i & '_Test.txt', 2)
		FileWrite($hFile, $sIEBodyText)
		FileClose($hFile)
	EndIf
Next
_IEQuit($oIE)
 
Автор
O

Ocago

Новичок
Сообщения
35
Репутация
0

Спасибо, отличный пример - вроде всё понятно и отлично работает :ok:
 
Автор
O

Ocago

Новичок
Сообщения
35
Репутация
0
Что-то теперь упёрся дальше :wacko:
Вот последний пример - отлично работает. Но, если надо после собирания ссылок и укладывания их в массив дальше по ним пройтись не просто с помощью _IENavigate:
;будем, например, переходить по последним 5-и ссылкам
For $i = $j To $aLinks[0][0]
_IENavigate($oIE, $aLinks[$i][1])

а с помощью _IEAction - как быть?
Например - _IEAction($aLink[$i][0], "click") ?
Пытался или ещё несколько вариантов.

Безуспешно. Пишет ошибку, что "в аргуметнах нет объекта" (Variable must be of type "Object"..)
Я так понимаю в аргументах _IEAction объект должен быть InternetExplorer.application (как-то так).

Почему тогда в начале топа в примере моём работет этот метод?
Понимаю,что какой-то маленький косяк, но не вижу его.

Подскажите уж, где не так и что, пожалуйста :smile:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
А тут, уже никак ;)
Дело в том что
Код:
_IEAction($aLink[$i][0], "click")
это метод OnMouseClick, а методы как нам известно присущи объектам, отсюда и предупреждение Variable must be of type "Object"...
В примере вы передаёте в _IEAction массив, а не объект.
 
Автор
O

Ocago

Новичок
Сообщения
35
Репутация
0
В примере вы передаёте в _IEAction массив, а не объект.

Неужели вариантов нет? Прям не верится, выход должен быть :smile:
А из массива объекты извлечь нельзя?
Он-же, массив, из них, из объектов состоит.
А потом к этим объектам применить метод уже.

Вначале примера - там-же в массив объекты загоняли вроде как.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Ocago сказал(а):
В примере вы передаёте в _IEAction массив, а не объект.

Неужели вариантов нет? Прям не верится, выход должен быть :smile:
А из массива объекты извлечь нельзя?
Он-же, массив, из них, из объектов состоит.
А потом к этим объектам применить метод уже.

Вначале примера - там-же в массив объекты загоняли вроде как.

В массиве, в примерах выше нет объектов! Там ссылки и текст! ;)
Но, выход всегда есть!

Вот попробуйте:
Код:
#include <IE.au3>
#include <Array.au3>

Dim $sMyString[2] = ['autoit', 'script']
Dim $aResult[1]
Dim $aSubmit[1]

$sURL = 'http://www.google.ru/search?hl=ru&newwindow=1&q=autoit+script&aq=f&aqi=g6&aql=&oq=&gs_rfai='
$oIE = _IECreate($sURL)
$oLinks = _IELinkGetCollection($oIE)

For $i = 0 To 1
  For $oLink in $oLinks
    If StringInStr(_IEPropertyGet($oLink, "innerText"), $sMyString[$i]) Then
        $aResult[0] = UBound($aResult)
        _ArrayAdd($aResult, $oLink.href)
    EndIf
  Next
Next

;~ _ArrayDisplay($aResult) ; смотрим массив с найденными ссылками

For $i = 1 To 5
	$iRand = Ceiling(Random($aResult[0]))
	ConsoleWrite('Random index links -> ' & $iRand & @CRLF)
	For $oLink in $oLinks
		If $oLink.href = $aResult[$iRand] Then
			_IENewTab($oIE, $oLink.href,1)
			$aSubmit[0] = UBound($aSubmit)
			_ArrayAdd($aSubmit, $oLink.href)
		EndIf
	Next
Next

;~ _ArrayDisplay($aSubmit) ; смотрим массив с отработанными ссылками

;~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;~ Доработанная функция из IE.au3. Суть доработки, в дополнительном 
;~ параметре $f_tab, который позволяет открывать новые окна или вкладки.
;~ Для открытия вкладок, нужно выставить третий параметр в 1 (true)
;~ Соответственно IE должен быть настроен на открытие новых окон во вкладках.
;~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Func _IENewTab(ByRef $o_object, $s_Url, $f_tab = 0, $f_wait = 1)
	If Not IsObj($o_object) Then
		__IEErrorNotify("Error", "_IENewTab", "$_IEStatus_InvalidDataType")
		Return SetError($_IEStatus_InvalidDataType, 1, 0)
	EndIf
	;
	If Not __IEIsObjType($o_object, "documentContainer") Then
		__IEErrorNotify("Error", "_IENewTab", "$_IEStatus_InvalidObjectType")
		Return SetError($_IEStatus_InvalidObjectType, 1, 0)
	EndIf

	If $f_tab Then
		$o_object.navigate($s_Url, $f_tab)
	Else
		$o_object.navigate($s_Url)
	EndIf
	
	If $f_wait Then
		_IELoadWait($o_object)
		Return SetError(@error, 0, -1)
	EndIf

	Return SetError($_IEStatus_Success, 0, -1)
EndFunc
 
Автор
O

Ocago

Новичок
Сообщения
35
Репутация
0
Шикарный пример :ok:
И функция с табами полезна очень, кстати.

Но, таки нужен метод _IEAction. К примеру, если на странице обрабатываемой ссылки открываются жабовой window.open - тогда только _IEAction сработает.

Удалось заставить работать этот пример с такой вот поправкой:
Код:
For $i = 1 To 2
    $iRand = Ceiling(Random($aResult[0]))
    ConsoleWrite('Random index links -> ' & $iRand & @CRLF)
    For $oLink in $oLinks
        If $oLink.innertext = $aResult[$iRand] Then
            _IEAction($oLink, 'click')  ; в таком варианте любые ссылки отрабатывает и жабовые в том числе - правда без табов
	   ;_IENewTab($oIE, $oLink.href,1) - а эта, очень полезная всё-таки, функция отрабатывает через .navigate - и жабовые линки не отрабатывает
           
              $aSubmit[0] = UBound($aSubmit)
            _ArrayAdd($aSubmit, $oLink.innertext)
        EndIf
    Next
Next


Так, что ещё усилие и почти получится то, что хотелось :smile:
Ещё-бы случайные отработки по уже отработанным ссылкам исключить, чтобы не повторять уже открытые окна.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Ocago [?]
Ещё-бы случайные отработки по уже отработанным ссылкам исключить, чтобы не повторять уже открытые окна.
Не пойму, зачем тогда Random?! Пройтись чисто по всем найденным ссылкам, и всё! ;) ;D
 
Автор
O

Ocago

Новичок
Сообщения
35
Репутация
0
Ну, бывает нужно именно рендомно. Скажем, ссылок 100 на странице вдруг (даже пусть 30-40) - это-ж все ресурсы отожрёт процесс, открывая окна и анализируя их.
А так - на удачу, несколько ссылочек - не больше 10-ка (а как показывает практика - больше 5ти не нужно) из этой кучи отработать, но разумеется уж совсем нет смысла тыкать в одну и ту-же ссылку.
А тут рэндомно как-то необычно работает вроде - повторяются ссылки. Хотя я не уверен - надо повнимательнее разобрать.
Главное, что удалось выборку таки реализовать и применить _IEAction. За что - огромное спасибо :smile:

Кстати, в табах IE всё равно запускает новый процесс и окно практически новое открывается (только уложено вроде как в табы).
Потом приходится отлавливать эти окна чтобы с ними работать. Но, это уже тема другого топика :smile:
 

deeman313

Новичок
Сообщения
9
Репутация
0
а как сделать наподобие этого, только чтобы одинаковые выбирались в массив не по тексту который написан, а по самой ссылке.
Например есть несколько ссылок, адрес которых содержит "view.php?ххххххх" где хххх часть которая меняется. А на самой странице (на что можно нажать) ссылки называются все по разному
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
deeman313
Попробуйте так:
Код:
#include <IE.au3>
#include <Array.au3>

$j = 0
Dim $aLinks[$j + 1][2]
$sUrl = 'http://www.google.ru/search?hl=ru&source=hp&q=autoit&aq=f&aqi=g10&aql=&oq=&gs_rfai='
$sSearch = 'autoitscript.com'

$oIE = _IECreate($sUrl)
$oLinks = _IELinkGetCollection($oIE)
For $oLink In $oLinks
    If StringInStr($oLink.href, $sSearch) Then
        $j += 1
        ReDim $aLinks[$j + 1][2]
        $aLinks[$j][0] = $oLink.innertext
        $aLinks[$j][1] = $oLink.href
    EndIf
Next
$aLinks[0][0] = $j
_ArrayDisplay($aLinks)
_IEQuit($oIE)
Только поменяйте $sUrl и $sSearch на свои значения.
 

deeman313

Новичок
Сообщения
9
Репутация
0
Спасибо большое, работает прекрасно! Вы настоящий autoIT гуру :IL_AutoIt_1:
 
Верх