VBA单击动态href

时间:2018-08-08 14:01:57

标签: html excel vba web-scraping

我正在尝试点击网站上带有标签的链接:

<a href="/dbget-bin/www_bget?dr:D01441:>D01441</a>

但是,我是在搜索唯一项目(我有一个包含9000多个唯一项目的数组)之后执行此操作,并且每个项目的“ D01441”部分都不相同,我事先不知道它是什么将为每个。以下代码处于循环中,遍历每个项目并一次搜索一个项目。搜索之后,我想单击出现的链接(上面的代码),然后在下一个网页上执行更多操作。

Dim IE As Object
Dim ele As Object
Set IE = CreateObject("InternetExplorer.Application")

...

For Each ele In IE.document.getElementsByTagName("a")
    If ele.Href = "/dbget-bin/www_bget?dr:D01441" Then
        ele.Click
        Exit For
    End If
Next

上面的代码不起作用,我不确定为什么。但是,一旦它开始工作,我不知道如何修改“ D01441”部分,以便可以单击任何搜索到的项目的链接。这是我想要的链接周围的更多html:

<tbody>
  <tr> ... </tr>
  <tr>
    <td class = "data1">
      <a href = "/dbget-bin/www_bget?dr:D01441:>D01441</a>
    </td>
    <td class = "data1">..</td>
    <td class = "data1">..</td>

...

编辑:要尝试处理变化的“ D01441”,我尝试使用InStr,但它也不起作用:

    For Each ele In IE.document.getElementsByTagName("a")
        If InStr(ele.Href, "/dbget-bin/www_bget?dr:") = 1 Then
            MsgBox "There"
            ele.Click
            Exit For
        End If
    Next

2 个答案:

答案 0 :(得分:3)

CSS选择器:

尝试使用通过querySelector的{​​{1}}方法应用的CSS选择器组合,以document的公共开始部分为目标。


应用选择器组合:

href

了解选择器组合:

这使用CSS选择器组合将元素定位为:

IE.document.querySelector("a[href^='/dbget-bin/www_bget?dr:']").Click

这表示带有a[href^='/dbget-bin/www_bget?dr:'] 标签的元素具有属性a,其值以 href'/dbget-bin/www_bget?dr:'的意思是开头。


实际查询:

以下是对HTML示例起作用的选择器:

sample


旁注:

如果您有多个带有^标签的元素,并且以a开头的href,则在大多数情况下,它将与第一个匹配。如果是这样的话,看到更多的HTML会有所帮助。我认为该HTML示例存在一些问题,因为从理论上讲,更具选择性的CSS查询可能是/dbget-bin/www_bget?dr:,以便包括.data1 a[href^='/dbget-bin/www_bget?dr:']的父元素类,而data1是一个类选择器。

答案 1 :(得分:2)

@QHarr答案是最优雅,最好的解决方案,但是...

要解决从href获取零件号的问题,可以像这样使用InStr

For Each ele In IE.document.getElementsByTagName("a")
    Dim partNumber As String
    Dim colonPosition As Long
    colonPosition = InStr(1, ele.Href, ":", vbTextCompare)
    If colonPosition > 0 Then
        partNumber = Right$(ele.Href, Len(ele.Href) - colonPosition)
        Debug.Print partNumber
    End If
Next ele