无法单击基于JavaScript的链接,该链接也是通过VBA使用Web元素在网页上的表格的一部分

问题描述 投票:0回答:1

我试图通过点击网页上的某些链接,将业务数据输入搜索框并将其与现有数据进行比较,尝试为我的业务自动化某个流程。但是,我没有成功点击基于javascript的链接,该链接也是使用VBA的表的一部分。该网站的相关HTML如下,

<tr class="odd"> <td> <a onclick="viewCompanyDetails('B214273', '1529481460070');" href="javascript:;">Alinda Infrastructure Fund III (Euro) GP SARL</a></td> <td><a onclick="viewCompanyDetails('B214273', '1529481460070');" href="javascript:;">B214273</a></td> </tr>

这是我做项目的不良尝试,

        Private Sub CommandButton1_Click()
        Set IE = CreateObject("InternetExplorer.Application")
        my_url = "https://www.lbr.lu/mjrcs/jsp/DisplayConsultDocumentsActionNotSecured.action?FROM_MENU=true&time=1528967707649&currentMenuLabel=menu.item.companyconsultation"

    consoletext = consoletext & "Connection established to Luxembourg Business Registers on www.rcsl.lu via Internet Explorer..." & vbNewLine & vbNewLine
    txtConsole.Value = consoletext
    consoletext = consoletext & "Looking up Registre De Commerce et des Societes." & vbNewLine & vbNewLine
    txtConsole.Value = consoletext

        With IE
            .Visible = True
            .navigate my_url

        Do Until Not IE.Busy And IE.readyState = 4
            DoEvents
        Loop

        End With

    For Each objlink In IE.document.getElementsByTagName("href")
    If objlink.href = "/mjrcs/jsp/DisplayConsultDocumentsActionNotSecured.action?FROM_MENU=true&time=1528969484260&currentMenuLabel=menu.item.companyconsultation" Then
    objlink.Click
    Exit For
    End If
    Next objlink

    Do Until Not IE.Busy And IE.readyState = 4
            DoEvents
        Loop

    consoletext = consoletext & "Looking up " & Sheets("Results").Range("N1").Value & " in the registry." & vbNewLine & vbNewLine
    txtConsole.Value = consoletext

    Dim TradeName As String
    TradeName = ThisWorkbook.Sheets("Results").Range("Y1").Value

     IE.document.getElementById("companyName").Value = TradeName

    Set objSubmit = IE.document.getElementsByTagName("input")

    For Each btn In objSubmit
        If btn.Value Like "Search" Then
            btn.Click
        End If
    Next

        Do Until Not IE.Busy And IE.readyState = 4
            DoEvents
        Loop

    For Each entitylink In IE.document.getElementsByClassName("tr")
    If entitylink.getElementsByTagName = "a" And entitylink.textcontent = Sheets("Results").Range("N1").Value And entitylink.href = "javascript:;" Then
    entitylink.Click
    Exit For
    End If
    Next entitylink


    txtXMLpath.Value = ""

End Sub

这就是网页内容的样子,

enter image description here

我隐藏了实体的名称以保护客户端的身份。我需要在图像的第一行单击结果。

如果你能提供任何帮助,我将非常感激。再说一次,我是VBA的初学者,不知道如何继续这里。如果您需要进一步澄清,请告诉我

javascript vba web-scraping html-parsing
1个回答
0
投票

您可以使用.querySelector获取您想要的元素,这是第一个

.document.querySelector("a[onclick='viewCompanyDetails('B214273', '1529481460070');']")

然后你可能需要做任何一件事:

.document.querySelector("a[onclick='viewCompanyDetails('B214273', '1529481460070');']").Click

要么

.document.querySelector("a[onclick='viewCompanyDetails('B214273', '1529481460070');']").fireEvent 'onclick'

CSS选择器:

CSS query

选择器返回HTML中的2个项目,但.querySelector只会在将选择器应用于HTML时返回第一个项目。首先是必需的"SARL"


有关.fireEvent方法的更多信息:

fireEvent方法:触发对象上的指定事件。

语法:object.fireEvent(bstrEventName,pvarEventObject, pfCancelled)

它有一个布尔返回值,如果TRUE告诉你事件被成功触发。


.querySelector方法:

Document方法querySelector()返回文档中与指定选择器或选择器组匹配的第一个Element。如果未找到匹配项,则返回null。

语法:element = document.querySelector(selectors); <==注意“;”在VBA中不使用


编辑:

如果不支持.querySelector方法,您可以尝试循环a标记并在找到特定字符串时单击,例如

Dim c As Object, n As Object
Set c = ie.document.getElementsByTagName("a")
For Each n In c
    If InStr(1, n.innerText, "Alinda Infrastructure Fund III (Euro) GP SARL") > 0 Then
        n.Click
        Exit For
    End If
Next n

如果没有更多的HTML来定位感兴趣的特定a标签,您可以通过以下方式对所有a标签进行一般性写作:

Dim c As Object, n As Object, counter As Long
Set c = ie.document.getElementsByTagName("a")
With ActiveSheet
    For Each n In c
        counter = counter + 1
        .Cells(counter, 1) = n.innerText
    Next n
End With

需要更多的HTML才能更好地定位;也许有一个className或Id来标识容纳这些a标签的元素?

对于您将表格写入表格的链接:

Option Explicit
Public Sub GetInfo()
    Dim ie As Object
    Application.ScreenUpdating = False
    Set ie = CreateObject("InternetExplorer.Application")
    With ie
        .Visible = True
        .navigate "https://www.lbr.lu/mjrcs"

        While .Busy Or .readyState < 4: DoEvents: Wend '<== Loop until loaded

        Dim links As Object, link As Object
        Set links = .document.getElementsByTagName("a")

        For Each link In links
            If link.innerText = "View the person's file" Then
                link.Click
                Exit For
            End If
        Next link

        While .Busy Or .readyState < 4: DoEvents: Wend

        .document.getElementById("companyName").innerText = "Alinda"
        .document.getElementsByClassName("button")(0).Click

        While .Busy Or .readyState < 4: DoEvents: Wend

        Dim hTable As HTMLTable
        Set hTable = .document.getElementsByClassName("commonTable")(0)

        Dim n As Object, tRow As Object, tCell As Object, tr As Object, td As Object, r As Long, c As Long, hBody As Object

        r = 1
        With ActiveSheet
            Set hBody = hTable.getElementsByTagName("tbody")
            For Each n In hBody                 'HTMLTableSection
                Set tRow = n.getElementsByTagName("tr") 'HTMLTableRow
                For Each tr In tRow
                    Set tCell = tr.getElementsByTagName("td")
                    c = 1
                    For Each td In tCell         'DispHTMLElementCollection
                        .Cells(r, c).Value = td.innerText 'HTMLTableCell
                        c = c + 1
                    Next td
                    r = r + 1
                Next tr
            Next n
        End With
        .Quit '<== Remember to quit application
    End With
    Application.ScreenUpdating = True
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.