【问题标题】:Pulling Link Text from Web Page - Visual Basic Excel从网页中提取链接文本 - Visual Basic Excel
【发布时间】:2018-04-22 08:58:27
【问题描述】:

快速上下文:我有一个基本的 Excel 电子表格,其中包含三个字段:Client_URL、Client_Name 和 AHREFs_Rank。当在 Client_URL 中输入 URL 时,我想:

  1. 登录 AHREF;
  2. 使用单元格 Client_URL 的值将客户端 URL 粘贴并输入到 Web 表单字段中;
  3. 为链接的内部文本提取 AHREF 的排名号。

我在执行第 3 步时遇到问题。

这是迄今为止使用的第 3 步的完整代码,我遇到了“编译错误:需要对象”问题。

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Row = Range("Client_URL").Row And _
       Target.Column = Range("Client_URL").Column Then

        Dim HTMLDoc As HTMLDocument
        Dim MyBrowser As InternetExplorer
        Dim MyHTML_Element As IHTMLElement
        Dim MyURL As String

        MyURL = "https://ahrefs.com/user/login"
        Set MyBrowser = New InternetExplorer
        MyBrowser.navigate MyURL
        MyBrowser.Visible = True

        Do
        Loop Until MyBrowser.readyState = READYSTATE_COMPLETE

        Set HTMLDoc = MyBrowser.document
        HTMLDoc.all.Email.Value = "login@email.com"
        HTMLDoc.all.Password.Value = "password123"

        For Each MyHTML_Element In HTMLDoc.getElementsByTagName("input")
            If MyHTML_Element.Type = "submit" Then MyHTML_Element.Click: Exit For
        Next

        MyURL = "https://ahrefs.com/dashboard/metrics"
        MyBrowser.navigate MyURL

        Do
        Loop Until MyBrowser.readyState = READYSTATE_COMPLETE

        Set HTMLDoc = MyBrowser.document
        HTMLDoc.activeElement.Value = Range("Client_URL").Value
        HTMLDoc.getElementById("dashboard_start_analysing").Click

        Do
            DoEvents
        Loop Until MyBrowser.readyState = READYSTATE_COMPLETE

        Set HTMLDoc = MyBrowser.document
        Dim rankInnertext As Object
        rankInnertext = HTMLDoc.getElementById("topAhrefsRank").innerText

        MsgBox rankInnertext

    End If

End Sub

如果我从“rankInnertext =”中删除“设置”,则会收到运行时错误 91“未设置对象变量”。

为了分解它,在第 3 步中,我已经:在前一页提交了一个字段,并正在等待当前页面完成加载。然后,我尝试提取 ID 为“topAhrefsRank”的链接的内部文本,并将单元格“AHREFs_Rank”的值设置为等于作为字符串的内部文本的值。

Visual Basic 的新手非常感谢任何帮助。

更新:根据建议更改了代码。已将 rankInnertext 从 String 更改为 Object。现在收到“运行时错误 91:对象变量或未设置块变量”

【问题讨论】:

  • 删除 set 关键字,因为 rankInnerText 不是对象和测试。
  • 您可能需要显示更多代码。可以分享网址吗?可能 HTMLDoc.getElementById("topAhrefsRank") 不正确或在调用时不可检索。
  • 除了 shrivallabha.redij 已经建议的内容之外,您也可以像这样查看Dim rankInnertext As Object : Set rankInnertext = HTMLDoc.getElementById("topAhrefsRank") : Msgbox rankInnertext.innerText 的内容。确保退出 semicolon 并从那里开始 newline
  • 嗨@SIM 我已经完全按照你的建议更新了代码,但是最后我收到了一个错误代码,例如“Msgbox rankInner.text.innerText”(错误 91 - 未设置对象变量“
  • 嗨@shrivallabha.redij 如原始帖子中所述,删除set 时,错误从编译错误变为对象变量未设置错误。

标签: vba excel


【解决方案1】:

试试这个 - 你得到一个错误吗?

    Dim rankInnertext '<< variant OK here
    rankInnertext = HTMLDoc.getElementById("topAhrefsRank").innerText
    MsgBox rankInnertext

【讨论】:

  • 是 - 错误 91“未设置对象变量”。
  • 好像没有那个id的元素?
  • 啊,但是有!我认为可能阻止这种情况的事情是该元素在页面加载时可能不可用(它使用数据源/脚本来提取数字/排名)并且加载这可能与页面加载分开,所以当页面完成加载时它会尝试在完全加载之前拉出这个元素。
【解决方案2】:

更新!我设法通过强制 VBA 等待特定时间来解决这个问题,以确保所有页面脚本都已加载。出于某种原因,无论我如何尝试等到页面加载,元素都不可用,因为它们是通过脚本加载的。

我按照以下代码强制执行时间延迟:

    Dim time1
    Dim time2

    time1 = Now
    time2 = Now + TimeValue("0:00:20")
     Do Until time1 >= time2
        DoEvents
        time1 = Now()
    Loop

正确的值现在显示在 msgbox 中,因此我现在可以提取这些数据并将其分配为 Excel 单元格的值,这正是我所追求的。

感谢所有回复的人 - 非常感谢!

【讨论】:

  • 这是典型的 AJAX 网页行为。使用计时器进行延迟是不可靠的。尝试进行额外的检查,例如 thisthis
猜你喜欢
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多