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
您需要使用@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
| 归档时间: |
|
| 查看次数: |
17975 次 |
| 最近记录: |