SciTe autohotkey获取活动浏览器页面的innertext

时间:2017-02-11 05:48:41

标签: autohotkey scite

我最近从excel VBA自动化开始尝试基于http://the-automator.com/web-scraping-intro-with-autohotkey/教程的autohotkey自动化,但我似乎无法理解代码,有人可以指出我正确的方向吗?

我正在尝试使用我的F1键来抓取当前活动的一些数据。

F1::

pwb := ComObjCreate("InternetExplorer.Application") ;create IE Object
pwb.visible:=true  ; Set the IE object to visible

pwb := WBGet()

;************Pointer to Open IE Window******************
WBGet(WinTitle="ahk_class IEFrame", Svr#=1) {               ;// based on ComObjQuery docs
   static msg := DllCall("RegisterWindowMessage", "str", "WM_HTML_GETOBJECT")
        , IID := "{0002DF05-0000-0000-C000-000000000046}"   ;// IID_IWebBrowserApp
;//     , IID := "{332C4427-26CB-11D0-B483-00C04FD90119}"   ;// IID_IHTMLWindow2
   SendMessage msg, 0, 0, Internet Explorer_Server%Svr#%, %WinTitle%

   if (ErrorLevel != "FAIL") {
      lResult:=ErrorLevel, VarSetCapacity(GUID,16,0)
      if DllCall("ole32\CLSIDFromString", "wstr","{332C4425-26CB-11D0-B483-00C04FD90119}", "ptr",&GUID) >= 0 {
         DllCall("oleacc\ObjectFromLresult", "ptr",lResult, "ptr",&GUID, "ptr",0, "ptr*",pdoc)
         return ComObj(9,ComObjQuery(pdoc,IID,IID),1), ObjRelease(pdoc)
      }
   }
}

我理解这段代码创建了一个新的IE应用程序,但如果我不想创建一个呢?这只是获取当前活动窗口?我看到一些代码允许我获取当前活动的浏览器URL,但我似乎无法获取当前活动的浏览器元素。

到目前为止,我已经尝试过了。有人可以告诉我如何让它指向活动页面并获取一些数据?

F1::

wb := WBGet()
if !instr(wb.LocationURL, "https://www.google.com/")
{
   wb := ""
   return
}
doc := wb.document
h2name    := rows[0].getElementsByTagName("h2")


FileAppend, %h2name%, Somefile.txt
Run Somefile.txt
return




WBGet(WinTitle="ahk_class IEFrame", Svr#=1) {               ;// based on ComObjQuery docs
   static msg := DllCall("RegisterWindowMessage", "str", "WM_HTML_GETOBJECT")
        , IID := "{0002DF05-0000-0000-C000-000000000046}"   ;// IID_IWebBrowserApp
;//     , IID := "{332C4427-26CB-11D0-B483-00C04FD90119}"   ;// IID_IHTMLWindow2
   SendMessage msg, 0, 0, Internet Explorer_Server%Svr#%, %WinTitle%
   if (ErrorLevel != "FAIL") {
      lResult:=ErrorLevel, VarSetCapacity(GUID,16,0)
      if DllCall("ole32\CLSIDFromString", "wstr","{332C4425-26CB-11D0-B483-00C04FD90119}", "ptr",&GUID) >= 0 {
         DllCall("oleacc\ObjectFromLresult", "ptr",lResult, "ptr",&GUID, "ptr",0, "ptr*",pdoc)
         return ComObj(9,ComObjQuery(pdoc,IID,IID),1), ObjRelease(pdoc)
      }
   }
}

尝试测试变量是否会写入somefile.txt,不太确定它应该如何使用msgbox进行测试。它一直在编写整个脚本,而不是显示结果。

1 个答案:

答案 0 :(得分:2)

要处理活动窗口的活动选项卡(如果它是Internet Explorer窗口):

q::
WinGet, hWnd, ID, A
WinGetClass, vWinClass, ahk_id %hWnd%
if !(vWinClass = "IEFrame")
Return
wb := WBGet("ahk_id " hWnd)
MsgBox % wb.document.activeElement.tagName "`r`n" wb.document.activeElement.innerText
wb := ""
Return

要处理第一个找到的Internet Explorer窗口的活动标签:

w::
WinGet, hWnd, ID, ahk_class IEFrame
wb := WBGet()
;wb := WBGet("ahk_class IEFrame") ;this line is equivalent to the one above
MsgBox % wb.document.activeElement.tagName "`r`n" wb.document.activeElement.innerText
wb := ""
Return

关于h2name,我不相信这会做任何事情, 因为“行”未在脚本中的任何位置定义。

h2name    := rows[0].getElementsByTagName("h2")

以下可能有效:

h2name := ""
try h2name := wb.document.getElementsByTagName("h2").item[0].name
MsgBox % h2name

MsgBox % wb.document.getElementsByTagName("h2").item[0].tagName
MsgBox % wb.document.getElementsByTagName("h2").item[0].innerText

在您的链接中,我认为'name'是指LocationName(标签的标题):

MsgBox % wb.LocationName
MsgBox % wb.document.title ;more reliable

对于整个页面的innerText:

MsgBox % wb.document.documentElement.innerText

HTH