Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VBA中有没有办法获取javascript生成的元素?_Javascript_Html_Ajax_Vba - Fatal编程技术网

在VBA中有没有办法获取javascript生成的元素?

在VBA中有没有办法获取javascript生成的元素?,javascript,html,ajax,vba,Javascript,Html,Ajax,Vba,我已经做了几个小时的Google detective工作(包括搜索StackOverflow),寻找一种技术,允许在VBA中定位JavaScript生成的HTML元素 例如,我无法在以下情况下使用ie.Document.getElementById(id): 然而,正如在google.com上测试的那样,该方法能够在静态页面上查找元素 我只是简单地从Document.body获取所有InnerText,然后解析该文件以获得所需的TD值,但在尝试拆分两个位于不同行上的值时遇到了障碍。作为说明,Sp

我已经做了几个小时的Google detective工作(包括搜索StackOverflow),寻找一种技术,允许在VBA中定位JavaScript生成的HTML元素

例如,我无法在以下情况下使用ie.Document.getElementById(id):

然而,正如在google.com上测试的那样,该方法能够在静态页面上查找元素

我只是简单地从Document.body获取所有InnerText,然后解析该文件以获得所需的TD值,但在尝试拆分两个位于不同行上的值时遇到了障碍。作为说明,Split(..)将以下内容理解为“2040”:

据我所知,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

基本上,我尝试使用列标题为市场构建一个HTML元素ID。因此,例如,如果market为“NGU12”,列标题为“Open”,则构建的ID为:“dt1_NGU12_Open”,这是TD元素的ID,包含market NGU12的“Open”值。

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

此外,如果您想在生成页面后测试特定id是否存在,您可以在IE中手动加载页面,并添加一个包含以下内容的bookmarklet作为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')};})())

您是否可以显示有关VBA代码的精简版本,而不是(或者)链接到整个页面?也可以展示几行JS。。。你确定你是在JS创建元素后运行VBA吗?对不起,我很难理解你在做什么和你想做什么。听起来像是在用JS抓取页面上的元素,但你想用VBA来抓取
有没有办法让JavaScript在调用Document.getElementById(..)之前为其编写必要的元素?
在何处编写?在调用什么之前?作为旁注,我想提到使用
innerText
将是一个棘手的问题。例如,Firefox不支持
innerText
,而是使用W3C标准
textContent
。空格的处理方式也会有所不同(例如,FF
textContent
不会出现换行符),您也会看到
脚本
标记内容。显然Opera(我自己没有试过)有
innerText
,但它被视为
textContent
。我觉得获得一致内容的唯一可靠方法是使用
innerHTML
,但随后您将解析标记,这是一个完全不同的问题。我已使用相关的VBA代码编辑了我的原始帖子。我自己没有运行任何JavaScript代码。该网站(在OP中链接)使用JS生成大型数据表。我在使用getElementByID(id)时遇到问题,因为它无法在这些类型的动态页面上检索任何内容。一旦页面完成加载(并且任何js生成的元素都已添加到文档中),那么“静态”和和生成的元素(就DOM而言):它们应该同样可以被脚本访问。如果您在页面加载和尝试访问其元素之间添加了一点延迟,这应该足以使任何动态内容对您可用。请注意,使用我在此处编写的bookmarklet,我找不到具有您在提供的页面上提供的示例id的元素。您可以尝试使用FF或Chrome加载页面,并使用其开发人员工具进行检查。我不确定IE9开发工具是什么样的,但IE8(我很遗憾不得不在工作中使用)是垃圾,要找到id需要一点工作。试试看,如果你没有任何运气,让我知道-我回家后可以再看看。
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')};})())