0

我已经做了几个小时的 Google 侦探工作(包括搜索 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 生成的,因此由该 JavaScript 创建的任何元素都不能成为我的 VBA 代码的目标。反正有没有让我的 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”且列标题为“Open”,则构建的 ID 为:“dt1_NGU12_open”,这是包含市场 NGU12 的“Open”值的 TD 元素的 ID。

4

1 回答 1

1

正如蒂姆所提到的,尝试访问时静态和动态生成的内容之间应该没有区别。尝试这个:

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 睡眠 API),但如果您需要更细粒度的控制,我会将其留给您。

此外,如果您想在页面生成后测试特定 id 是否存在,您可以在 IE 中手动加载页面并添加一个包含以下内容的书签作为 URL:

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')};})())
于 2012-08-06T02:13:51.663 回答