首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VBA:如何在<td>标记中获取隐藏的href

VBA:如何在<td>标记中获取隐藏的href
EN

Stack Overflow用户
提问于 2014-03-10 21:22:55
回答 1查看 8.5K关注 0票数 1

我试图从1930年以来的足球世界杯中获得分数,在这个链接中列出了比赛的内容,并点击球队中的一个新窗口弹出我正在寻找的总结。我的问题是,在HTML源代码中,我没有像通常那样看到带有href的<a>标记,而是尝试用以下VBA代码模拟单击事件:

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

Vba代码:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-10 21:52:41

我会以不同的方式来做这件事,因为你想要达到的目标需要一个巨大的开销,并且可能会让你对链接、动作、循环以及诸如此类的东西大惊小怪。与其模拟这些操作,不如更好地模拟这些操作的结果。

德国-阿根廷比赛为例.当您单击它时,它会打开以下弹出:

这里特别要注意的是弹出的URL。直观地说,URL有一些奇怪的组合,可能是唯一的标识符。我们首先检查的是刚才单击的表中该行的标记。

检查突出显示的部分:它类似于我们弹出的地址,尽管在开头有四个额外的字符。通过折叠行并与其他行进行交叉检查,我们得出结论,这些行使用类似的格式:

g_1_tr标记的id属性中移除将为每个匹配提供唯一标识符。我将采取消毒id意大利-英格兰比赛,我将输入到一般的网址。当弹出的地址栏被锁定时,我们将在另一个选项卡中这样做:

瞧。该页在另一个选项卡中打开,从那里您可以从匹配摘要中获得所需的内容。您甚至可以通过将#match-summary更改为#h2h;overall来检查头对头。

这有什么关系?

因为这样更安全。由于您使用的是Excel,所以在您的控件中有工作表。最安全的方法是将所有这些id属性从每一行记录到一列中。然后在该列上循环,适当地连接它以生成目标URL。

然后遍历URL,从您正在寻找的精确页面中获得所需的内容。此时不再需要原始链接/表,因为几乎所有的细节都在“摘要”页面中。

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

后续编辑

由于我觉得没有发布任何代码有点内疚,下面是我尝试为世界杯部分生成id值的尝试。请注意,我对代码有些随意,所以修改它以更好地适应您的方法。我将只提供获取id值的方法。其他一切都取决于你。

代码语言:javascript
复制
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值:

代码语言:javascript
复制
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

希望这能帮到你更多。请务必阅读评论。祝好运!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22311579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档