Что нового

Найти ссылки на странице по части строки в URL, как?.. (есть особенность)

Ocago

Новичок
Сообщения
35
Репутация
0
Доброго времени суток всем,
Притормозился на, вроде-бы, тривиальной задаче:
Необходимо найти на странице все ссылки, содержащие в строке URL заранее заданные части строки.
Например - если есть "out.php" или переменная "c=ru" или любая другая последовательность, заранее указанная.

Если в URL ссылки есть такие строки, то такeую ссылку отработать через _IEAction("focus", "click" или любым событием уже).
Ключевым в задаче вопросом является именно возможность обработки через метод.

Логично спарсить страницу и собрать ссылки заранее, потом отработать их (по любым условиям). Удобно через массив вроде как.
Но, как потом массив обработать именно методом?

Вот, кстати, шикарный вариант с массивом, но к нему не применить метод
Код:
#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)

_IEQuit($oIE)


(спасибо за пример madmasles)

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

Waik

Знающий
Сообщения
60
Репутация
16
Необходимо найти на странице все ссылки, содержащие в строке урла заранее заданные части строки.
Например - если есть "out.php" или переменная, например, есть в урле - "c=ru" или любая другая последовательность, заранее указанная.

StringRegExp ?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
«в урле» я так пониаю это «в Url», но можно подумать что там опечатка, и на самом деле имелось в виду «в урне» :laugh:

{LangWarn.Admin}
 
Автор
O

Ocago

Новичок
Сообщения
35
Репутация
0
Waik сказал(а):

Как именно использовать регулярные выражения в данном случае?
А то у меня силы слабые не хватает ума :-[ ещё, чтобы вкурить адекватно понять синтаксис регулярных выражений.
(синтаксис моих сообщений откорректировал в соответствие с требованиями форума :smile: Уважаемый CreatoR - прошу заменить расстрел на пожизненное :-[ )

Вот, кстати, вроде работает в таком виде

Код:
#include <IE.au3>
#include <Array.au3>

Dim $sMyString = "index.php"
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($oLink.href, $sMyString) 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
            _IEAction($oLink, 'click')
            $aSubmit[0] = UBound($aSubmit)
            _ArrayAdd($aSubmit, $oLink.href)
        EndIf
    Next
Next

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


Спасибо камраду Garrett за полезный пример.
Но, в этом примере тоже есть ньюанс - поиск в URL только одной строки я сообразил как сделать ($sMyString = "index.php").
А как-бы реализовать возможность нескольких таких строк через "или"?
Массив не соображу как прикрутить :blink:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Ocago [?]
А как-бы реализовать возможность нескольких таких строк через "или"?
Да.
Массив не соображу как прикрутить
Код:
#include <IE.au3>
#include <Array.au3>

Dim $sMyString = "wiki"
Dim $sMyString2 = "AutoIt"
Dim $sMyString3 = "gl=ru"
Dim $aResult[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 $oLink in $oLinks
    If	StringInStr($oLink.href, $sMyString, 1) _ 
	Or StringInStr($oLink.href, $sMyString2, 1) _ 
	Or StringInStr($oLink.href, $sMyString3, 1) _
	Then
		$aResult[0] = UBound($aResult)
		_ArrayAdd($aResult, $oLink.href)
    EndIf
  Next

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

Ocago

Новичок
Сообщения
35
Репутация
0
Логично. А сколько таких "Or" можно навтыкать?
Если, скажем 10-20 - как оно тогда?
И там в переменных можно использовать знаки типа "&-?"?

Более оптимального (элегантного) решения нет?
Или это просто, но надёжно, как автомат калашникова :smile:
 

madmasles

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

Dim $aMyString[3] = ["wiki", "AutoIt", "gl=ru"]
Dim $aResult[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 $oLink In $oLinks
	For $i = 0 To UBound($aMyString) - 1
		If StringInStr($oLink.href, $aMyString[$i], 1) Then
			If _ArraySearch($aResult, $oLink.href) = -1 Then
				$aResult[0] = UBound($aResult)
				_ArrayAdd($aResult, $oLink.href)
			EndIf
		EndIf
	Next
Next
_ArrayDisplay($aResult) ; смотрим массив с найденными ссылками
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Ocago [?]
И там в переменных можно использовать знаки типа "&-?"?
Можно.

Более оптимального (элегантного) решения нет?
Код:
;~ ...
  For $oLink in $oLinks
	Select
	Case StringInStr($oLink.href, $sMyString, 1)
		$aResult[0] = UBound($aResult)
        _ArrayAdd($aResult, $oLink.href)
	Case StringInStr($oLink.href, $sMyString2, 1)
		$aResult[0] = UBound($aResult)
        _ArrayAdd($aResult, $oLink.href)
	Case StringInStr($oLink.href, $sMyString3, 1)
		$aResult[0] = UBound($aResult)
        _ArrayAdd($aResult, $oLink.href)
	EndSelect
  Next
;~ ...

По мне так первый вариант "элегантнее" :smile:


Добавлено:
Сообщение автоматически объединено:

madmasles
Хороший пример :ok:
 
Автор
O

Ocago

Новичок
Сообщения
35
Репутация
0
Ну, да - попроще как-то, спокойнее первый - согласен :smile:

Но, вот с массивом (чуть выше пример) madmasles - порадовал.
Компактно и работает.
Теперь осталось выяснить как с загрузкой железа всё это дело справляется - что меньше грузит память и пр. при больших массивах ссылок.
А так - можно считать вопрос решён.

Всем огромное спасибо и позитив с плюсами :beer:
 

JohnWind

Новичок
Сообщения
57
Репутация
0
не смог бы кто-нибудь перевести работающие примеры кода выше на браузер Chrome или Edge?
увы, ИЕ остался в ооочень далёком прошлом.

заранее спасибо.
 
Верх