SciTe autohotkey 获取活动浏览器页面的内部文本
SciTe autohotkey to get active browser page's innertext
我最近从 excel VBA 自动化转向尝试基于 http://the-automator.com/web-scraping-intro-with-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 应用程序,但如果我不想创建一个怎么办?哪个只是为了获取当前活动window?我看到一些代码可以让我获取当前活动的浏览器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 进行测试。它一直在编写整个脚本而不是显示结果。
要在活动 window 的活动选项卡上工作(如果它是 Internet Explorer window):
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 window 的活动选项卡:
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,我不相信这会有什么用,
因为 'rows' 没有在脚本中的任何地方定义。
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
在你的 link 中,我认为 'name' 他们指的是 LocationName(选项卡的标题):
MsgBox % wb.LocationName
MsgBox % wb.document.title ;more reliable
对于整个页面的innerText:
MsgBox % wb.document.documentElement.innerText
HTH
我最近从 excel VBA 自动化转向尝试基于 http://the-automator.com/web-scraping-intro-with-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 应用程序,但如果我不想创建一个怎么办?哪个只是为了获取当前活动window?我看到一些代码可以让我获取当前活动的浏览器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 进行测试。它一直在编写整个脚本而不是显示结果。
要在活动 window 的活动选项卡上工作(如果它是 Internet Explorer window):
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 window 的活动选项卡:
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,我不相信这会有什么用, 因为 'rows' 没有在脚本中的任何地方定义。
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
在你的 link 中,我认为 'name' 他们指的是 LocationName(选项卡的标题):
MsgBox % wb.LocationName
MsgBox % wb.document.title ;more reliable
对于整个页面的innerText:
MsgBox % wb.document.documentElement.innerText
HTH