VBA:如何在标记内获取隐藏的href

时间:2014-03-10 21:22:56

标签: vba excel-vba web-scraping excel

我试图从1930年开始从足球世界杯中得到分数,在这个链接中列出了匹配,并通过点击团队一个新窗口弹出我正在寻找的摘要。我的问题是,在HTML源代码中,我没有看到<a>内部带有href的标签,我正试图使用​​以下VBA代码模拟点击事件:

链接:http://www.flashscore.com/soccer/world/world-cup-1990/results/

Vba代码:

Sub Test()
  Dim URL As String
  Dim IE As InternetExplorer
  Dim HTMLdoc As HTMLDocument
  Dim TDelements As IHTMLElementCollection
  Dim TDelement As HTMLTableCell
  Dim i As Integer

URL = "http://www.flashscore.com/soccer/world/world-cup-1990/results/"

Set IE = New InternetExplorer

With IE
    .Navigate URL
    .Visible = True

    While .Busy Or .ReadyState <> READYSTATE_COMPLETE: DoEvents: Wend

        Set HTMLdoc = .Document
    End With

        Set TDelements = HTMLdoc.getElementsByTagName("td")

        For Each TDelement In TDelements

            If TDelement.Title = "Click for match detail!" Then
                TDelement.Click
            End If
        Next

   IE.Quit
End Sub

1 个答案:

答案 0 :(得分:3)

我会以不同的方式做到这一点,因为你想要实现的目标需要大量的开销,并且可能会让你对链接,动作,循环以及诸如此类的东西进行疯狂的追逐。不是模拟动作,而是模仿动作的结果更好。

德国 - 阿根廷比赛为例。当您单击它时,它会打开此弹出窗口:

enter image description here

这里特别注意弹出窗口的URL。直观地说,URL有一些奇怪的组合,可能是唯一的标识符。我们检查的第一件事是我们刚刚点击的表中该行的标记。

enter image description here

检查突出显示的部分:它与弹出窗口中的地址非常相似,尽管开头有四(4)个额外字符。折叠行和交叉检查与其他行,我们得出结论,行使用类似的格式:

enter image description here

id标记的tr属性中删除 g_1 _ 会为每个匹配提供唯一标识符。我将从意大利 - 英格兰比赛中获取已清理过的id,我会将其输入到通用网址中。当弹出式地址栏被锁定时,我们将在另一个标签中执行此操作:

enter image description here

瞧。页面在另一个选项卡中打开,从那里您可以从匹配摘要中获得所需内容。您甚至可以通过将#match-summary更改为#h2h;overall来进行正面交锋。

enter image description here

为什么这很重要?

因为它更安全。由于您使用的是Excel,因此您可以控制工作表。最安全的方法是将每行中的所有id属性记录到列中。然后循环遍历该列,正确连接它以生成目标URL。

然后,您可以循环访问这些网址,并从您要查找的 EXACT 页面获取所需内容。此时不再需要原始链接/表格,因为几乎所有细节都在“摘要”页面中。

希望这会有所帮助,祝你好运。

后续修改

由于我觉得有点内疚而没有发布任何代码,这是我尝试为世界杯部分生成id值。请注意,我对代码采取了一些自由,因此请对其进行修改以更好地适应您的方法。我只会提供获取id值的方法。其他一切都取决于你。

Sub Test()

    Dim URL As String
    Dim IE As New InternetExplorer
    Dim HTMLdoc As HTMLDocument
    Dim dictObj As Object: Set dictObj = CreateObject("Scripting.Dictionary")
    Dim tRowID As String

    URL = "http://www.flashscore.com/soccer/world/world-cup-1990/results/"

    With IE
        .Navigate URL
        .Visible = True
        Do Until .ReadyState = READYSTATE_COMPLETE: DoEvents: Loop
        Set HTMLdoc = .Document
    End With

    With HTMLdoc
        'Target the set of tables.
        Set tblSet = .getElementById("fs-results")
        'Index starts at 0. World Cup Playoffs is (0), World Cup is (1),
        'Qualifiers is (2), etc... Targeting tbody right away, as there is
        'only one (1) tbody tag per row anyway.
        Set mTbl = tblSet.getElementsByTagName("tbody")(1)
        Set tRows = mTbl.getElementsByTagName("tr")
        With dictObj
            'If if value is not yet in dictionary, store it.
            For Each tRow In tRows
                'Remove the first four (4) characters.
                tRowID = Mid(tRow.getAttribute("id"), 5)
                If Not .Exists(tRowID) Then
                    .Add tRowID, Empty
                End If
            Next tRow
        End With
    End With

    'Print out each of the ID values.
    For Each Key In dictObj
        Debug.Print Key
    Next Key

    Set IE = Nothing

End Sub

返回世界杯桌子的以下id值(不是季后赛!):

04LfR6G7
6RNojjg8
nww8zBgL
t0xCZU8R
dKY0Pgu3
jsY4ODf9
K4YcDdti
2qM7lD3j
bXvdGk2k
tdU0F9He
65hR8YfM
lUsW7hAS
jBqaxXO8
YZY3yivF
n1HjSn11
hvInTSoe
rHUdQZPd
xfS51jmd
ncyhHVnq
4b34kglp
O0kz7LJH
lpQE9EuG
UHlQLBvS
fNQAAfQ9
CKpewD92
EmJrU8Wl
KnT4ETW1
nRnnVlHr
b3T12WXk
jwUc3CIq
n9RDMiPL
pAjW714B
GznS8sk5
GWR6BzB3
UXW8NX9F
beX1CGec

希望这会对你有所帮助。请务必阅读评论。祝你好运!