将对象设置为HTML iFrame并访问其文档中的元素
我正在尝试刮取一个内部网网站(由于内部网我无法共享链接,对此表示抱歉),其结构如下:将对象设置为HTML iFrame并访问其文档中的元素,html,vba,iframe,xmlhttprequest,Html,Vba,Iframe,Xmlhttprequest,我正在尝试刮取一个内部网网站(由于内部网我无法共享链接,对此表示抱歉),其结构如下: <html> <body> <iframe id="myIframe">#document</iframe> </body> </html> Dim test2 As Object Set test2 = oHtml.getElementById("myIframe") 但是,如果我尝试在VBA中执行同样
<html>
<body>
<iframe id="myIframe">#document</iframe>
</body>
</html>
Dim test2 As Object
Set test2 = oHtml.getElementById("myIframe")
但是,如果我尝试在VBA中执行同样的操作,我将无法执行,因为对象settest2=oHtml.getElementById(“myIframe”)
是Nothing
我定义test2
的方法如下:
首先,我通过XMLHTTP请求获得了该网页的HTML文档:
Dim XMLHTTP As Object, oHtml As Object, pontod As Object
On Error Resume Next
Set oHtml = New HTMLDocument
With CreateObject("WINHTTP.WinHTTPRequest.5.1")
.Open "GET", websiteLink, False
.send
oHtml.body.innerHTML = .responseText
End With
因此,我将test2
声明为对象,并尝试将其设置为:
<html>
<body>
<iframe id="myIframe">#document</iframe>
</body>
</html>
Dim test2 As Object
Set test2 = oHtml.getElementById("myIframe")
同样,问题是上面的test2
设置为Nothing
,而如果我尝试在JavaScript上(直接在网页上)执行同样的操作,则情况并非如此
这可能取决于我在VBA中获得的HTML文档来自WINHTTP.WinHTTPRequest.5.1
请求这一事实吗?有没有人有办法解决这个问题并获得myIframe
的文档
另外,我明白“在黑匣子上”工作是不好的,但不幸的是这是一个内部网络;请毫不犹豫地询问您是否需要任何其他信息(只要我能提供:)您是否等待oHTML中的文档加载和呈现
您还应该验证从WinHTTPRequest获得的源代码是否与您在javascript中使用的源代码相同。您是否等待
oHTML
中的文档加载和呈现?您还应该验证从WinHTTPRequest获得的源代码是否与您在javascript中使用的源代码相同。感谢@TimWilliams提供的提示。我一直在等待加载文档(使用通常的Do而不是ready
),您是否认为一个好的平等性测试可能是在使用internetexplorer.application
浏览页面后,将我的oHTML
与browseObject.document
进行比较?这可能有效。或者使用fiddler来比较这两种反应。很难说清楚,因为我猜你简化了问题中的HTML…@TimWilliams是的,简化了。非常感谢您提供的提示,我将尝试这样做,并将信息反馈给您。@TimWilliams刚刚通过VBA试用了internet explorer应用程序对象,并得到了正确的结果。因此,我猜想XMLHTTP请求给出的HTML响应与我在浏览器上看到的不一样(这是我用appIE.document
得到的文档)。请你写下你的提示作为回答,我会接受的?非常感谢你的帮助。谢谢蒂姆。事实上,我从WinHTTPRequest获得的源代码并不等同于使用JavaScript的源代码。因此,我获得了一个浏览器对象(Set-appIE=CreateObject(“internetexplorer.application”)
,appIE.Navigate-myLink
,Set-HTMLsrc=appIE.document
)的良好源代码,并获得了HTMLsrc.frames(“myiFrame”).document中的元素。