我一直在谷歌侦探工作几个小时(包括搜索StackOverflow),以获得一种技术,允许在VBA中定位JavaScript生成的HTML元素。
例如,我不能在此使用ie.Document.getElementById(id):http://www.kisfutures.com/electronic.html?page=quote&sym=NGU12&mode=i
然而,该方法非常能够在google.com上测试静态页面上查找元素。
我玩简单地从Document.body获取所有InnerText,然后解析文件以获得我想要的TD值,但是当我尝试拆分不同行上的两个值时遇到了障碍。作为说明,Split(..)将以下内容理解为“2040”:
20
40
根据我的理解,getElementById(id)的问题是网页的表是在页面加载后由JavaScript生成的,因此我的VBA代码无法将该JavaScript创建的任何元素作为目标。反正有没有我的VBA代码看到这个JavaScript生成的内容?
感谢您的帮助!
修改
正在使用的VBA代码:
Function Quote(Market, Parameter)
Set ie = CreateObject("InternetExplorer.Application")
ie.Navigate "http://www.kisfutures.com/electronic.html?page=quote&sym=NGU12&mode=i"
While ie.Busy
DoEvents
Wend
Dim id As String
id = "dt1_" & Market & "_" & StrConv(Parameter, vbLowerCase)
Quote = ie.Document.getElementByID(id).InnerText
ie.Quit
End Function
基本上我尝试使用Market的列标题构建HTML元素ID。因此,例如,如果市场是“NGU12”并且列标题是“开放”,则构建的ID是:“dt1_NGU12_open”,它是包含市场NGU12的“开放”值的TD元素的ID。
答案 0 :(得分:1)
正如Tim所提到的,在尝试访问时,静态和动态生成的内容之间应该没有区别。试试这个:
Function Quote(Market, Parameter)
Set ie = CreateObject("InternetExplorer.Application")
ie.Navigate "http://www.kisfutures.com/electronic.html?page=quote&sym=NGU12&mode=i"
While ie.Busy
DoEvents
Wend
Application.Wait Now + TimeSerial(0,0,1) 'Pause 1 second, hopefully
'the dynamic content is
'generated within this
'time-frame
Dim id As String
id = "dt1_" & Market & "_" & StrConv(Parameter, vbLowerCase)
Quote = ie.Document.getElementByID(id).InnerText
ie.Quit
End Function
有更好的方法可以暂停执行(请参阅Windows Sleep API),但如果您需要更精细的控制,我会留给您。
此外,如果您想在页面生成后测试是否存在特定ID,您可以在IE中手动加载页面并添加包含以下内容的书签:
javascript:void((function() {var a = document.getElementById(prompt('Please enter an id to test','dt1_NGU12_open')); if (a) {alert('Element found');} else {alert('Element not found')};})())