【问题标题】:Excel VBA - Get all href links from a websiteExcel VBA - 从网站获取所有 href 链接
【发布时间】:2021-09-20 12:36:09
【问题描述】:

您好,希望有人可以帮助我。 在此示例链接上:https://www.academiadasapostas.com/stats/competition/brasil/26

我想获取所有作为“VS”目标的href链接。 我正在尝试这样的示例:

Sub ScrapeScores()

Dim IE As New SHDocVw.InternetExplorer
Dim HTMLDoc As MSHTML.HTMLDocument
Dim HTMLTables As MSHTML.IHTMLElementCollection
Dim HTMLTable As MSHTML.IHTMLElement
Dim HTMLDiv As MSHTML.IHTMLElement
Dim TableSection As MSHTML.IHTMLElement
Dim TableRow As MSHTML.IHTMLElement
Dim TableCell As MSHTML.IHTMLElement
Dim RowText As String



IE.Visible = True
IE.navigate "https://www.academiadasapostas.com/stats/competition/brasil/26"

Do While IE.readyState <> READYSTATE_COMPLETE Or IE.Busy
Loop

Set HTMLDoc = IE.document
Set HTMLDiv = HTMLDoc.getElementById("competition-round-group-0")
Set HTMLTables = HTMLDiv.getElementsByTagName("a")

For Each HTMLTable In HTMLTables
    Debug.Print HTMLTable.ID, "&", HTMLTable.className
    
    For Each TableSection In HTMLTable.Children
        Debug.Print , TableSection.tagName
        
    Next TableSection
    
Next HTMLTable


End Sub

但没有成功。我想我可以将 CSS 与 SelectorAll 一起使用,对吧?既然 IE 会被淘汰,那么改用 CSS 就好了。

提前感谢您的任何回答。

【问题讨论】:

    标签: excel vba web-scraping export-to-excel


    【解决方案1】:

    您可以将以下 css 模式与 querySelectorAll .competition-rounds td:nth-child(4) &gt; a 一起使用。循环返回的nodeList 并从每个节点中提取href。这将选择该表中的第 4 列,然后选择子 a 标记,在循环期间从中提取 href 属性。


    必填参考资料:

    1. Microsoft Internet 控件
    2. Microsoft HTML 对象库

    Option Explicit
    
    Public Sub PrintLinks()
        Dim ie As SHDocVw.InternetExplorer, nodeList As MSHTML.IHTMLDOMChildrenCollection
    
        Set ie = New SHDocVw.InternetExplorer
    
        With ie
    
            .Visible = True
            .Navigate2 "https://www.academiadasapostas.com/stats/competition/brasil/26"
            
            While .Busy Or .readyState <> READYSTATE_COMPLETE: DoEvents: Wend
            
            Set nodeList = ie.Document.querySelectorAll(".competition-rounds td:nth-child(4) > a")
            
            Dim i As Long
            
            For i = 0 To nodeList.length - 1
              
                Debug.Print nodeList.Item(i).href
    
            Next
            
            Stop
    
            .Quit
        End With
    End Sub
    

    阅读:

    1. :nth-child()
    2. Child combinator

    【讨论】:

    • 哇!这就像一个魅力。对于存储在工作表上,只需更改“Debug.Print”以将代码复制到那里,对吗?我试图理解“.competition-rounds td:nth-child(4) > a”的理论,以便复制到另一个链接。如果 IE 将被淘汰,将使用什么来代替?
    • 是的,只需将 debug.print 更改为 cells(row, column) = ....... 至于理论,请阅读两个链接。基本上,我使用td:nth-child(4) 切出表格的第4 列,然后&gt; a 在该列中获取子a 标签,即那些具有您想要的链接的标签。稍后的 IE 版本将存在一段时间,但如果使用 VBA,您应该考虑使用 Chrome 切换到 selenium basic,或者查看是否可以通过 xmlhttp 请求(即无浏览器请求)检索内容。
    • 我正在查看这些链接,谢谢。我能够在另一个链接上复制该方法,并设法获得了 href。只是略有不同,因为在同一行上,第 4 项不是“VS”。但是收集 3 + 4,我可以锻炼。如果有兴趣,这里是链接:academiadasapostas.com/stats/livescores 我不知道 Selenium Basic 和 Chrome,但我肯定会研究它,也许可以用作解决方案。再次,非常感谢。
    【解决方案2】:

    如果你想摆脱 IE,应该这样做:

    Sub GetTragetLinks()
        Const Url = "https://www.academiadasapostas.com/stats/competition/brasil/26"
        Dim Html As HTMLDocument, I&
        
        Set Html = New HTMLDocument
    
        With CreateObject("MSXML2.XMLHTTP")
            .Open "GET", Url, False
            .send
            Html.body.innerHTML = .responseText
        End With
        
        With Html.querySelectorAll("tr[id*='gsm_id_'] td[title] > a")
            For I = 0 To .Length - 1
                Debug.Print .item(I).href
            Next I
        End With
    End Sub
    

    参考添加:

    Microsoft HTML Object Library
    

    【讨论】:

    • 谢谢。完美运行,作为不必使用 IE 甚至打开它的优势,这很棒。例如,当我尝试将解决方案复制到此页面 - academiadasapostas.com/stats/livescores 时,我无法使其工作。我猜主要是因为“id”。你能帮忙吗?
    • 这个tr td.score &gt; a 可能会有所帮助。如果它无法获取所需的链接,请随时创建一个描述您的要求的新帖子。
    • 是的....我玩弄了添加 xmlhttp 的尝试。很高兴有人添加它。
    猜你喜欢
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2013-10-04
    • 1970-01-01
    • 2015-10-11
    • 2023-03-03
    相关资源
    最近更新 更多