【问题标题】:VBA - Navigating HTML table with IF functionVBA - 使用 IF 函数导航 HTML 表格
【发布时间】:2017-10-18 08:28:01
【问题描述】:

我正处于一个项目的尾声,偶然发现了我的最后一个障碍。我在一个 Excel 表格中有一组电影,我正在 BoxOfficeMojo.com 中查找并从中抓取大量数据。

我的问题可以用电影《唱》来概括。当我搜索该标题时,我被定向到此网页:http://www.boxofficemojo.com/search/?q=sing。现在我必须导航到电影特定页面的代码如下:

 'open title page in box office
        Set Doc = objIE.Document
        Set oResult = Doc.getElementById("body").getElementsByTagName("a")
        For Each Element In oResult
            If Element.outerHTML Like "*/movies/?id=*" Then
                Set myLink = Element
                Exit For
            End If
        Next Element

        objIE.Navigate myLink

该代码仅导航到第一个电影链接,这不是我想要的。如果“终身总收入”列没有说“n/a”,我只想点击一个链接。理想情况下,这样的事情会起作用(IF 函数中的新代码):

'open title page in box office
        Set Doc = objIE.Document
        Set oResult = Doc.getElementById("body").getElementsByTagName("a")
        For Each Element In oResult
            If Element.outerHTML Like "*/movies/?id=*" And Element.Offset(0, 2).innerText <> "n/a" Then
                Set myLink = Element
                Exit For
            End If
        Next Element

        objIE.Navigate myLink

但这不起作用。关于我如何做到这一点的任何想法?谢谢!

【问题讨论】:

    标签: html excel vba web-scraping


    【解决方案1】:

    我建议遍历每个表,直到找到正确的表,然后遍历每一行,直到找到符合条件的表。

    Dim HTMLTable As Object
    Dim i As Long
    
    'Loop through each table to find the right one
    For Each HTMLTable In Doc.getElementsByTagName("table")
        If Left(HTMLTable.Rows(0).Cells(0).innerText, 11) = "Movie Title" Then
            Exit For
        End If
    Next HTMLTable
    
    If Not HTMLTable Is Nothing Then 'table found
        For i = 1 To HTMLTable.Rows.Length - 1 'loop through each row and check gross column
            If HTMLTable.Rows(i).Cells(2).innerText <> "n/a" Then 'found row
                Set myLink = HTMLTable.Rows(i).Cells(0).getElementsByTagName("a")(0) 'get link
                myLink.Click 'click link
                Exit For
            End If
        Next i
    Else 'table not found
        MsgBox "The table was not found.", vbExclamation
    End If
    

    如果你使用早期绑定,你可以声明HTMLTable如下...

    Dim HTMLTable As MSHTML.HTMLTable
    

    希望这会有所帮助!

    【讨论】:

    • 嘿@domenic - 由于某种原因,此代码仅在部分时间有效。当我手动执行它时,它似乎可以正常工作,但是当我自动运行它时,它经常导航到错误的页面。任何想法为什么?如果您愿意,我可以将我的整个代码粘贴到某个地方
    • 有时需要更多时间来加载页面。尝试等待几秒钟,然后将文档从 IE 分配给变量 Doc。所以就在Set Doc = objIE.Document 之前,添加Application.Wait(Now + TimeValue("0:00:03"))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多