【问题标题】:Various errors with VBA Loop to pull HTML data使用 VBA 循环提取 HTML 数据的各种错误
【发布时间】:2016-03-05 01:52:21
【问题描述】:

我收到以下 VBA 代码的各种错误(最近的错误是运行时错误“70”:权限被拒绝)。基本上,代码/工作表连接到客户的 Intranet IE 数据库,搜索客户活动并将任何活动导入工作表(最终将使用该活动进行报告)。这是我遇到错误的地方,具体取决于我搜索的时间长短我有时要提取多个页面的活动,这需要单击“下一步”按钮并从每个页面中提取数据,直到不再有“下一个” " 按钮(没有更多活动)。我设置的循环将从第一页拉出,单击“下一步”按钮,然后有时会从第二页拉出,但随后会出现错误。所以我认为错误与页面的加载有关,但我添加了暂停以允许加载但仍然遇到相同的错误。我真的被困在这个问题上,不幸的是,在我解决这个问题之前,我无法推进这个项目。

这里是sn-p的代码:

    Dim TDelements As IHTMLElementCollection
    Dim TDelement As HTMLTableCell
    Dim r As Long, i As Long
    Dim e As Object

    Set TDelements = IE.document.getElementsByTagName("tr")
    r = 0
    For i = 1 To 1
        Application.Wait Now + TimeValue("00:00:03")
        For Each TDelement In TDelements
            If TDelement.className = "searchActivityResultsContent" Then
                Sheet1.Range("E1").Offset(r, 0).Value = TDelement.ChildNodes(8).innerText
                r = r + 1
            ElseIf TDelement.className = "searchActivityResultsContent" Then
                Sheet1.Range("E1").Offset(r, 0).Value = TDelement.ChildNodes(8).innerText
                r = r + 1
            End If
        Next
        Application.Wait Now + TimeValue("00:00:02")
        Set elems = IE.document.getElementsByTagName("input")
        For Each e In elems
            If e.Value = "Next Results" Then
                e.Click
                i = 0
                Exit For
            End If
        Next e
    Next i
    Do Until Not IE.Busy And IE.readyState = 4
        DoEvents
    Loop
    IE.Quit
End Sub

任何帮助/建议将不胜感激。谢谢!

【问题讨论】:

  • 哪一行出现错误?使用IE, document and element state checks sequentially 而不是Application.Wait。或者你可以试试to retrieve the data via XHR
  • 感谢您的回复,给出错误的行(大多数情况下)是“对于 TDelements 中的每个 TDelement”。至于您的建议,我尝试过使用 IE、文档和元素状态检查,但仍然遇到同样的问题……我将其切换到 application.wait 命令,因为加载活动页面有时需要几秒钟。抱歉,我绝不是 VBA 的专家,XHR 是什么?从这个意义上说,我该如何利用它?
  • 你能分享你正在使用的 URL 吗?关于 XHR,请尝试按照我之前评论中链接的步骤操作。
  • 抱歉,这是一个基于 Intranet Web 的程序,所以它只能在我的网络上使用。我明白你所说的关于 XHR 的内容......我不完全确定我是否能够访问 XML 文件,但这肯定是一个更简单的解决方案,所以我会试一试!跨度>
  • Dim所有变量为Variant,出现错误后,进入调试器,输入即时窗口? TypeName(TDelements)? TDelements.length? TypeName(TDelement)。你有什么输出?

标签: vba excel web-scraping


【解决方案1】:

查看您的代码:

'getting any TD elements here
Set TDelements = IE.document.getElementsByTagName("tr")

'waiting here....
Application.Wait Now + TimeValue("00:00:03")

'now trying to use items in TDelements...
For Each TDelement In TDelements
   '...
Next

您在使用Application.Wait 时是否正在等待页面加载?

如果是,那么您应该知道TDelements 不是动态 - 它不会在加载新的 TD 元素时自行更新:它只是当您出现时的元素快照叫getElementsByTagName("tr")。因此,等待之后调用它。

【讨论】:

  • 感谢您的回复!我尝试了您的建议,在等待后调用getElementsByTagName("tr"),不幸的是我仍然遇到相同的“权限被拒绝”错误......尽管我似乎在不同的地方遇到了错误。我设法(仅一次)在循环中运行了两次,然后抛出了我能得到的最远的错误,所以你可能在正确的轨道上!
  • 您遇到的错误很难修复。如果你增加等待时间,这有帮助吗?
  • 不幸的是,没有......这是我尝试的第一件事之一,它仍然会抛出错误,只是需要更长的时间才能到达那里。我什至尝试在我认为有意义的各个地方等待,但我仍然遇到错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2023-01-24
相关资源
最近更新 更多