1 (изменено: Alex_Lexon, 2018-01-24 23:22:09)

Тема: AHK: Получение элемента из <a href => из IE

Здравствуйте!
В браузере на странице есть следующий элемент:

<a href="/asd-dsa">Dsaasd</a>

Мне нужно из этого извлечь "/asd-dsa", желательно, не используя RegEx.
Заранее спасибо за ответы.

2

Re: AHK: Получение элемента из <a href => из IE

Этот элемент называется «ссылка». Она там одна?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Получение элемента из <a href => из IE

teadrinker, вроде одна.

4

Re: AHK: Получение элемента из <a href => из IE

Тогда так примерно:

linkText := "Dsaasd"

oIE := WBGet()
if !IsObject(oIE)  {
   MsgBox, Не удалось получить объект InternetExplorer
   return
}
links := oIE.document.links, href := ""
Loop % links.length  {
   link := links[A_Index - 1]
   if (link.innerText = linkText && href := link.href)
      break
}
MsgBox, % href ? href : "Не найдено"

WBGet(WinTitle := "ahk_class IEFrame", Svr# := 1)
{
   static msg := DllCall("RegisterWindowMessage", Str, "WM_HTML_GETOBJECT")
        , IID_IWebBrowserApp := "{0002DF05-0000-0000-C000-000000000046}"
        , IID_IHTMLDocument2 := "{332C4425-26CB-11D0-B483-00C04FD90119}"
        , VT_DISPATCH := 9, F_OWNVALUE := 1
        
   SendMessage, msg, 0, 0, Internet Explorer_Server%Svr#%, %WinTitle%
   lResult := ErrorLevel
   if (lResult = "FAIL")
      return
   
   VarSetCapacity(GUID, 16, 0)
   DllCall("ole32\CLSIDFromString", WStr, IID_IHTMLDocument2, Ptr, &GUID)
   DllCall("oleacc\ObjectFromLresult", Ptr, lResult, Ptr, &GUID, Ptr, 0, PtrP, pdoc)
   oWb := ComObject(VT_DISPATCH, ComObjQuery(pdoc, IID_IWebBrowserApp, IID_IWebBrowserApp), F_OWNVALUE)
   ObjRelease(pdoc)
   return oWb
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: Alex_Lexon, 2018-01-25 00:23:42)

Re: AHK: Получение элемента из <a href => из IE

Спасибо за способ, но он не подходит для решения. Дело в том, что узнать саму ссылку мне и нужно по причине динамичного текста.
Есть страница, что время от времени обновляется, в ней появляются разные ссылки с разным текстом. Нужно проверить, нужная мне ссылка сейчас или нет, а текст всё время разный.

6

Re: AHK: Получение элемента из <a href => из IE

Если ссылка всего одна на странице, тогда так:

oIE := WBGet()
if !IsObject(oIE)  {
   MsgBox, Не удалось получить объект InternetExplorer
   return
}
MsgBox, % oIE.document.links[0].href

WBGet(WinTitle := "ahk_class IEFrame", Svr# := 1)
{
   static msg := DllCall("RegisterWindowMessage", Str, "WM_HTML_GETOBJECT")
        , IID_IWebBrowserApp := "{0002DF05-0000-0000-C000-000000000046}"
        , IID_IHTMLDocument2 := "{332C4425-26CB-11D0-B483-00C04FD90119}"
        , VT_DISPATCH := 9, F_OWNVALUE := 1
        
   SendMessage, msg, 0, 0, Internet Explorer_Server%Svr#%, %WinTitle%
   lResult := ErrorLevel
   if (lResult = "FAIL")
      return
   
   VarSetCapacity(GUID, 16, 0)
   DllCall("ole32\CLSIDFromString", WStr, IID_IHTMLDocument2, Ptr, &GUID)
   DllCall("oleacc\ObjectFromLresult", Ptr, lResult, Ptr, &GUID, Ptr, 0, PtrP, pdoc)
   oWb := ComObject(VT_DISPATCH, ComObjQuery(pdoc, IID_IWebBrowserApp, IID_IWebBrowserApp), F_OWNVALUE)
   ObjRelease(pdoc)
   return oWb
}

Если не одна, а текст меняется, тогда по какому признаку искать?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7 (изменено: Alex_Lexon, 2018-01-25 00:26:56)

Re: AHK: Получение элемента из <a href => из IE

teadrinker, а не нужно искать конкретную) Нужно перебрать все в надежде на соответствие с нужной.
В теории можно через innerHTML и RegEx, но просто надеялся, что есть DOM функция для извлекания ссылки, ибо так надёжнее.

8

Re: AHK: Получение элемента из <a href => из IE

А в чём должно быть соответствие?
Все можно так перебрать:

oIE := WBGet()
if !IsObject(oIE)  {
   MsgBox, Не удалось получить объект InternetExplorer
   return
}
links := oIE.document.links
Loop % links.length  {
   link := links[A_Index - 1]
   MsgBox, % "Link text: " . link.innerText . "`nLink href: " . link.href
}

WBGet(WinTitle := "ahk_class IEFrame", Svr# := 1)
{
   static msg := DllCall("RegisterWindowMessage", Str, "WM_HTML_GETOBJECT")
        , IID_IWebBrowserApp := "{0002DF05-0000-0000-C000-000000000046}"
        , IID_IHTMLDocument2 := "{332C4425-26CB-11D0-B483-00C04FD90119}"
        , VT_DISPATCH := 9, F_OWNVALUE := 1
        
   SendMessage, msg, 0, 0, Internet Explorer_Server%Svr#%, %WinTitle%
   lResult := ErrorLevel
   if (lResult = "FAIL")
      return
   
   VarSetCapacity(GUID, 16, 0)
   DllCall("ole32\CLSIDFromString", WStr, IID_IHTMLDocument2, Ptr, &GUID)
   DllCall("oleacc\ObjectFromLresult", Ptr, lResult, Ptr, &GUID, Ptr, 0, PtrP, pdoc)
   oWb := ComObject(VT_DISPATCH, ComObjQuery(pdoc, IID_IWebBrowserApp, IID_IWebBrowserApp), F_OWNVALUE)
   ObjRelease(pdoc)
   return oWb
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Получение элемента из <a href => из IE

Моей идеей было получить полный список всех ссылок, а позже через цикл провести на наличие соответствий с нужной для меня.

10

Re: AHK: Получение элемента из <a href => из IE

А зачем позже, проверяйте прямо во время перебора.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11 (изменено: Alex_Lexon, 2018-01-25 00:54:30)

Re: AHK: Получение элемента из <a href => из IE

teadrinker, неправильно выразился, это и имел в виду)
Я и сам находил ".links" и ".href" решения, но почему-то они не определяют ничего.. Вполне возможно, что я чего-то не понимаю, или просто криворукий.. Поэтому, наверное, воспользуюсь все-таки RegEx`ом.
Но всё же большое спасибо!)

12

Re: AHK: Получение элемента из <a href => из IE

Укажите конкретный сайт и какую ссылку хотите получить.

13 (изменено: Alex_Lexon, 2018-01-26 01:16:32)

Re: AHK: Получение элемента из <a href => из IE

https://www.mmorpg.com/sweepstakes
Ссылки на игры, что находятся в классе "contestopen". Справа от описания есть названия игр, что являются ссылками, ссылки на игры из класса "contestopen" и нужны.

14

Re: AHK: Получение элемента из <a href => из IE

Ссылки находятся во фрейме:

oIE := ComObjCreate("InternetExplorer.Application")
oIE.visible := True
oIE.navigate("https://www.mmorpg.com/sweepstakes")
While oIE.busy  
   Sleep, 20
links := oIE.document.parentWindow.frames[6].document.links
Loop % links.length  {
   link := links[A_Index - 1]
   MsgBox, % "Link text: " . link.innerText . "`nLink href: " . link.href
}

15 (изменено: Alex_Lexon, 2018-01-26 22:34:39)

Re: AHK: Получение элемента из <a href => из IE

Не работает данный способ, возможно, Вы не совсем поняли, про какие ссылки я говорю.

16

Re: AHK: Получение элемента из <a href => из IE

У меня работает:

oIE := ComObjCreate("InternetExplorer.Application")
oIE.visible := True
oIE.navigate("https://www.mmorpg.com/sweepstakes")
While oIE.busy  
   Sleep, 20
links := oIE.document.links
Loop % links.length  {
   link := links[A_Index - 1]
   if (link.innerText = "Hyper Universe")
      MsgBox, % link.href
}

17 (изменено: Alex_Lexon, 2018-01-26 23:01:19)

Re: AHK: Получение элемента из <a href => из IE

Malcev, да, этот код действительно работает! Спасибо.
А если мне нужно вывести ссылки из getElementsByClassName, то тогда как? Ибо если пробую после класса ставить .links, то выдаёт - undefined.

18

Re: AHK: Получение элемента из <a href => из IE

А в чем проблема? Приведите код.

19

Re: AHK: Получение элемента из <a href => из IE

Malcev, при вводе этого:

document.getElementsByClassName("contestopen")[0].cells[1].links

выводит undefined

20

Re: AHK: Получение элемента из <a href => из IE

document.getElementsByClassName("contestopen")[0].getElementsByTagName("a")[0].href

Также можно через QuerySelectorAll либо XPath, почитайте информацию сами если заинтересует.

21

Re: AHK: Получение элемента из <a href => из IE

teadrinker пишет:

Тогда так примерно:

linkText := "Dsaasd"

oIE := WBGet()
if !IsObject(oIE)  {
   MsgBox, Не удалось получить объект InternetExplorer
   return
}
links := oIE.document.links, href := ""
Loop % links.length  {
   link := links[A_Index - 1]
   if (link.innerText = linkText && href := link.href)
      break
}
MsgBox, % href ? href : "Не найдено"

WBGet(WinTitle := "ahk_class IEFrame", Svr# := 1)
{
   static msg := DllCall("RegisterWindowMessage", Str, "WM_HTML_GETOBJECT")
        , IID_IWebBrowserApp := "{0002DF05-0000-0000-C000-000000000046}"
        , IID_IHTMLDocument2 := "{332C4425-26CB-11D0-B483-00C04FD90119}"
        , VT_DISPATCH := 9, F_OWNVALUE := 1
        
   SendMessage, msg, 0, 0, Internet Explorer_Server%Svr#%, %WinTitle%
   lResult := ErrorLevel
   if (lResult = "FAIL")
      return
   
   VarSetCapacity(GUID, 16, 0)
   DllCall("ole32\CLSIDFromString", WStr, IID_IHTMLDocument2, Ptr, &GUID)
   DllCall("oleacc\ObjectFromLresult", Ptr, lResult, Ptr, &GUID, Ptr, 0, PtrP, pdoc)
   oWb := ComObject(VT_DISPATCH, ComObjQuery(pdoc, IID_IWebBrowserApp, IID_IWebBrowserApp), F_OWNVALUE)
   ObjRelease(pdoc)
   return oWb
}

Здравствуйте. Воспользовался Вашим кодом. для моих целей работает превосходно. Но не могу понять как сделать так что бы в конце не выпрыгивало окно с ссылкой. не могли бы Вы помочь разобраться? Хотелось бы что бы ссылка просто записывалась в переменную допустим activlink. Но что бы не было этого окна по завершению скрипта. Но что бы осталось окно о том что ссылка не найдена.

22

Re: AHK: Получение элемента из <a href => из IE

Замените в примере, строку:

MsgBox, % href ? href : "Не найдено"

На:


if (href)
	activlink := href
else
	MsgBox, Не найдено.

23 (изменено: romzes96, 2018-03-15 23:43:45)

Re: AHK: Получение элемента из <a href => из IE

KusochekDobra
Спасибо. Все работает хорошо.

24

Re: AHK: Получение элемента из <a href => из IE

Доброго времени суток! Вы не могли бы подсказать на примере вашего кода, который замечательно работает, как реализовать несколько иную задачу - необходимо на основе подстроки из link.href выбирать определенные ссылки, т.е. в данном вашем коде и примере с сайта нужно находить, возьмем тот же Hyper Universe, в атрибуте href="/sweepstakes/hyper-universe-mvp-starter-pack-sweepstakes-1000000057" подстроку hyper-universe, и выводить полную ссылку с этой подстрокой в тот же MsgBox. Я пробовал использовать if Var contains MatchList - if link.href contains hyper-universe, но в этом случае выводятся все ссылки подряд. Видимо, по неопытности я чего-то еще не понимаю.

Malcev пишет:

У меня работает:

oIE := ComObjCreate("InternetExplorer.Application")
oIE.visible := True
oIE.navigate("https://www.mmorpg.com/sweepstakes")
While oIE.busy  
   Sleep, 20
links := oIE.document.links
Loop % links.length  {
   link := links[A_Index - 1]
   if (link.innerText = "Hyper Universe")
      MsgBox, % link.href
}

25

Re: AHK: Получение элемента из <a href => из IE

По условию, отображаемый текст ссылки должен быть эквивалентен "Hyper Universe" без учёта регистра. Если нужны все ссылки, отображаемый текст которых содержит "Hyper Universe", можно записать так:


oIE := ComObjCreate("InternetExplorer.Application")
oIE.visible := True
oIE.navigate("https://www.mmorpg.com/sweepstakes")
While oIE.busy  
	Sleep, 20
links := oIE.document.links
Loop % links.length  {
	link := links[A_Index - 1]
	if (CheckString(link.innerText, "Hyper Universe"))
		MsgBox, % link.href
}
ExitApp
CheckString(mainStr, srchStr) {
	if mainStr contains %srchStr%
		return true
	return false
}

Если нужны ссылки только из заголовков к каждой игре, то можно сделать выборку по классу и потом проходить циклом по её результату:


oIE := ComObjCreate("InternetExplorer.Application")
oIE.visible := True
oIE.navigate("https://www.mmorpg.com/sweepstakes")
While oIE.busy  
	Sleep, 20
links := oIE.document.querySelectorAll(".suhlink")
Loop % links.length  {
	link := links[A_Index - 1]
	if (CheckString(link.innerText, "Hyper Universe"))
		MsgBox, % link.href
}
ExitApp
CheckString(mainStr, srchStr) {
	if mainStr contains %srchStr%
		return true
	return false
}

Если необходимо искать вхождения "hyper-universe" в тексте ссылки, замените условие:


if (CheckString(link.innerText, "Hyper Universe"))

На:


if (CheckString(link.href, "hyper-universe"))

26 (изменено: estenha, 2018-03-16 18:05:05)

Re: AHK: Получение элемента из <a href => из IE

estenha пишет:

Доброго времени суток! Вы не могли бы подсказать на примере вашего кода, который замечательно работает, как реализовать несколько иную задачу...

Сделал через IfInString и Array.Push (мне к тому же еще нужен именно последний элемент из списка идентичных ссылок.) Если кому интересно:

Larray := []
Needle = hyper-universe-
oIE := ComObjCreate("InternetExplorer.Application")
oIE.visible := True
oIE.navigate("https://www.mmorpg.com/sweepstakes")
While oIE.busy  
   Sleep, 20
links := oIE.document.links
; MsgBox % links.length
Loop % links.length  {
   link := links[A_Index - 1]
   b := link.href
   IfInString, b, %Needle%
	{
;	  MsgBox, % link.href
	  Larray.Push(link.href)
	}
}
z := Larray.MaxIndex()
MsgBox % "Последний элемент " Larray[z]

; for index, element in Larray ; здесь можно посмотреть, что в массиве
;	{
;		MsgBox % "Element number " . index . " is " . element
;	}

27 (изменено: estenha, 2018-03-16 15:57:00)

Re: AHK: Получение элемента из <a href => из IE

KusochekDobra
Спасибо, опробую и ваш вариант.
p.s. я опоздал на 35 секунд )