使用VBA通过Access导航网页/ maniuplate IE

Joh*_*oob 5 html ms-access internet-explorer vba

Hello StackOverflow社区,

我有一个关于使用Access VBA来操纵IE的问题.

本质上,我正在尝试编写将使用IE打开特定网页的代码,搜索特定链接的页面(目标链接的名称将取决于用户的具体情况),通过编程方式单击该页面导航到新页面链接,然后通过在生成的新页面上查找特定的链接/元素来重复该过程.

最终目标链接的显示文本将始终相同,但它所驻留的页面在每种情况下都会有所不同.

我的问题是以编程方式在二级页面中搜索驻留在那里的元素...我的结果只给出了来自第一级页面的元素,即使在浏览器加载了新链接之后也是如此.

如果我到目前为止描述问题的背景我做得不好,请道歉.

我的代码基本上如下:

Dim ie As Object, ieDoc As HTMLDocument

Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True

strHTML = "http://targetsite.com/first-level_page"

ie.navigate strHTML

'wait for browser
While ie.ReadyState <> READYSTATE_COMPLETE
DoEvents
Wend


'define first-level target link and search for it and then "click" it

Dim i As Integer
Dim txt As String, link As String, p As String

Set ieDoc = ie.Document

txt = "First-Level Target"
    Do Until link = txt Or i >= 1000
    i = i + 1
    link = ieDoc.Links(i).outerText
Loop

'I know the above loop is not exactly ideal in its current form, but it does give me a working first attempt at the functionality I'm trying to build.    

ieDoc.Links(i).Click
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.上面的代码按预期工作.在所有情况下,它都能正确导航到所需的二级页面.我出错的地方是当我尝试搜索最后一个目标元素的第二级页面时:

'wait for browser
While ie.ReadyState <> READYSTATE_COMPLETE
DoEvents
Wend

'Search for final target element (which always has the same name and anchor text on all second-level pages)
ieDoc.getElementsByName("final-target-name").Item.Click
Run Code Online (Sandbox Code Playgroud)

如果我尝试在第一级页面上使用它,上面的行(基于.getElementsByName)就可以正常工作.但是一旦我导航到任何二级页面,它什么都不做.我还尝试用上面循环的修改版本替换它,搜索第一级页面上的链接.结果相同.

作为故障排除步骤,我还使用debug.print命令替换该行,以简单地命名二级页面上的所有元素,这总是返回第一页中的元素名称.

我假设很明显,在我按照第一个链接后,我在某种程度上无法正确更新或重新定义我的HTML文档.我将ieDoc设置为no,然后将其重新设置为ie.document,但这也不起作用.

希望有一个简单的命令或语法,我只是无知.但是对于我的生活,我没有能够让VBA在点击第一个链接后正确引用页面上存在的HTML元素.

提前感谢任何建议!

〜JQN

dur*_*rbo 2

您需要使用@Matteo NNZ 和@TimWilliams 的组合

如果您知道元素的“id”名称,则更容易使用 getElementsByName("target")。

如果您不知道“id”,则循环锚元素并搜索正确的文本。这缩小到只有链接或元素。

Set Anchors = IeDoc.getElementsByTagName("a")
Run Code Online (Sandbox Code Playgroud)

然后循环比较 .outertext 或您需要的任何子字段。

@TimWilliams:您需要加载找到的 URL,然后在循环内设置新加载的 IeDoc。将“ie”对象设置为新的“ie”加载页面,否则“ie”对象将正确保留加载的第一个页面。当您找到链接时,您需要像已经完成的那样加载新页面。

'' throw away the first page loaded.
ie = nothing 
IeDoc = nothing

'' Set the new page loaded.
ie.navigate newHTML

'wait for browser
While ie.ReadyState <> READYSTATE_COMPLETE
DoEvents
Wend

Set IeDoc = ie.Document
Run Code Online (Sandbox Code Playgroud)

对第二页重复上述过程

以下是有关“在 vba 中解析 HTML”的一些其他资源: http://www.ozgrid.com/forum/showthread.php ?t=184695 Parse HTML content in VBA