在VBA中有没有办法获取javascript生成的元素?
我已经做了几个小时的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代码:在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
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
。空格的处理方式也会有所不同(例如,FFtextContent
不会出现换行符),您也会看到脚本
标记内容。显然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')};})())