Html VBA单击无唯一标识符的下一页按钮

Html VBA单击无唯一标识符的下一页按钮,html,excel,vba,web-scraping,Html,Excel,Vba,Web Scraping,下面粘贴的代码部分尝试循环浏览web搜索的每个页面。执行此操作的按钮由下面的html定义。循环只在第二个页面上运行,无论结果页面数如何,此时,我收到一个被拒绝的权限(错误70) Sub finrascrape() 模糊的物体 Dim pgcount、a、i、commaindex作为整数 尺寸B名称、cc、cnum、pg、nb为IHT规定 Dim blist、clist、pagelist、nextb、testtxt、testtxt2作为IHTMLElementCollection 设置ie=Cre

下面粘贴的代码部分尝试循环浏览web搜索的每个页面。执行此操作的按钮由下面的html定义。循环只在第二个页面上运行,无论结果页面数如何,此时,我收到一个被拒绝的权限(错误70)

Sub finrascrape()
模糊的物体
Dim pgcount、a、i、commaindex作为整数
尺寸B名称、cc、cnum、pg、nb为IHT规定
Dim blist、clist、pagelist、nextb、testtxt、testtxt2作为IHTMLElementCollection
设置ie=CreateObject(“internetexplorer.application”)
brokersearch=InputBox(“输入代理名称或CRD”)
firmsearch=InputBox(“输入公司名称或CRD”)
geosearch=InputBox(“输入邮政编码(必须是有效的邮政编码,否则留空)”)
与ie
.导航“https://brokercheck.finra.org/"
.Visible=True
请稍等片刻。忙碌或。准备就绪状态4
多芬特
环
以
Set intags=ie.document.getElementsByTagName(“输入”)
每种进口gat
如果gat.placeholder=“Name或CRD#”,则
gat.Value=brokersearch
设置evt=ie.document.createEvent(“键盘事件”)
evt.initEvent“change”,真,假
gat.dispatchEvent evt
ElseIf gat.placeholder=“公司名称或CRD(可选)”然后
gat.Value=firmsearch
设置evt=ie.document.createEvent(“键盘事件”)
evt.initEvent“change”,真,假
gat.dispatchEvent evt
ElseIf gat.placeholder=“城市、州或邮政编码(可选)”然后
gat.Value=geosearch
设置evt=ie.document.createEvent(“键盘事件”)
evt.initEvent“change”,真,假
gat.dispatchEvent evt
其他的
如果结束
下一关
ie.document.getElementsByClassName(“md提升md主md-hue-2 md按钮md墨水波纹”)。项。单击
在忙或准备状态4时执行
多芬特
环
Set pagelist=ie.document.getElementsByClassName(“粗体深蓝色绑定”)
对于页面列表中的每个页面
如果pg.className=“bold font深蓝ng绑定”,则
a=pg.innerText
退出
调试。打印一个
如果结束
下一页
pgcount=工作表功能汇总(a/12,0)
调试。打印pgcount
表格(“结果”)。选择
范围(“A1”).Value=“经纪人名称”
范围(“B1”).Value=“经纪人CRD”
范围(“C1”).Value=“邮寄城市”
范围(“D1”).Value=“邮寄状态”
范围(“E1”).Value=“邮寄地址”
带范围(单元格(1,1),单元格(1,单元格(1,Columns.Count).End(xlToLeft.Column))
.Font.Bold=True
.HorizontalAlignment=xlCenter
以
对于i=1到pgcount
错误时转到报告完成
Set blist=ie.document.getElementsByClassName(“较小的ng绑定flex”)
对于blist中的每个bname
表格(“结果”)。选择
工作表(“结果”).Range(“A”和Range(“A”和Rows.Count).End(xlUp).Row+1).Value=bname.innerText
下一个bname
Set clist=ie.document.getElementsByClassName(“较小”)
对于clist中的每个cnum
表格(“流程”)。选择
如果cnum.className=“更小”,则
工作表(“流程”).Range(“A”和Range(“A”和Rows.Count).End(xlUp).Row+1).Value=cnum.innerText
如果结束
下一个cnum
表格(“流程”)。选择
对于a=1到工作表(“处理”).Range(“a”和Rows.Count).End(xlUp).Row
如果左(板材(“加工”).Range(“A”&A).Value,4)=“CRD#”,则
表格(“结果”)。选择
工作表(“结果”).范围(“B”和范围(“B”和行数”).结束(xlUp).行+1.值=右(工作表(“流程”).范围(“A”)和A.值,Len(工作表(“流程”).范围(“A”)-7)
如果InStr(图纸(“工艺”)范围(“A”和A+1).值“,”)=0,则
工作表(“流程”)。范围(“A”&A+1)。Value=“不可用,NA XXXXX”
如果结束
ElseIf InStr(表(“流程”)。范围(“A”和“A”)。值“,”)>0
commaindex=InStr(图纸(“流程”).范围(“A”和A).值“,”)
表格(“结果”)。选择
工作表(“结果”)。范围(“C”和工作表(“结果”)。范围(“C”和行数)。结束(xlUp)。行数+1)。值=左(工作表(“流程”)。范围(“A”)。值,commaindex-1)
工作表(“结果”).范围(“D”和工作表(“结果”).范围(“D”和行数).结束(xlUp).行数+1).值=左(右)(工作表(“流程”).范围(“A”和A).值_
Len(图纸(“工艺”).范围(“A”和“A”)-commaindex-1),2)
工作表(“结果”).范围(“E”和工作表(“结果”).范围(“E”和行数).结束(xlUp).行数+1).值=左(右)(工作表(“流程”).范围(“A”和A).值_
Len(图纸(“工艺”).范围(“A”和“A”)-commaindex-4),5)
其他的
如果结束
表格(“流程”)。选择
下一个
表格(“流程”)。单元格。清除
Set testtxt=ie.document.getElementsByTagName(“a”)
对于testtxt中的每个txt
如果txt.className=“ng binding”,则
点击
在忙或准备状态4时执行
多芬特
环
设置testtxt2=ie.document.getElementsByTagName(“a”)
对于a=pgcount到2步骤-1
对于testtxt2中的每个txt2
如果txt2.className=“ng binding”和txt2.innerText=a&“of”&pgcount&“pages”,则
'Debug.Print a
转到“”的“”结尾
如果结束
下一个txt2
下一个
如果结束
下一个文本
以下各项的结束日期:
a=pgcount
在忙或准备状态4时执行
多芬特
环
接下来我
报告完成:
MsgBox“FINRA Web刮片完成。请审阅。”
端接头
HTML:


  • 搜索登录页的URL为。任何帮助都将不胜感激。

    我开发了一个循环,如下所示,它成功地导航“a”标记的元素,根据前面元素的内部文本识别正确的按钮,并在每个页面中循环

    Set testtxt = ie.document.getElementsByTagName("a")
    
    If i < pgcount Then
    For d = 1 To testtxt.Length
    If testtxt.Item(d).innerText = i & " of " & pgcount & " pages" Then
    testtxt.Item(d + 1).Click
    Do While ie.Busy Or ie.readyState <> 4
    DoEvents
    Loop
    Exit For
    End If
    Next d
    End If
    
    Set testtxt=ie.document.getElementsByTagName(“a”)
    如果我不算的话
    对于d=1到testtxt.Length
    如果testtxt.Item(d).innerText=i&“of”&pgcount&“pages”,则
    testtxt.Item(d+1)。单击
    在忙或准备状态4时执行
    多芬特
    环
    退出
    如果结束
    下一个d
    如果结束
    
    这就是您可以遍历所有27页并获取代理名称的方法

    Sub Get_Content()
        Dim ie As New InternetExplorer, html As HTMLDocument
        Dim itm As Object, post As Object, posts As Object, elem As Object
    
        With ie
            .Visible = True
            .navigate "https://brokercheck.finra.org/"
            Do Until .readyState = READYSTATE_COMPLETE: Loop
            Set html = .document
        End With
    
        Set evt = html.createEvent("keyboardevent")
        evt.initEvent "change", True, False
    
        For Each itm In html.getElementsByTagName("input")
            If InStr(itm.placeholder, "Name or CRD#") > 0 Then
                itm.Value = "Michael John"
                Exit For
            End If
        Next itm
        itm.dispatchEvent evt
    
        For Each post In html.getElementsByTagName("input")
            If InStr(post.placeholder, "Firm Name or CRD# (optional)") > 0 Then
                post.Value = "Morgan Stanley"
                Exit For
            End If
        Next post
        post.dispatchEvent evt
    
        html.getElementsByClassName("md-button")(0).Click
        Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop
    
        Do
            For Each elem In html.getElementsByClassName("smaller ng-binding flex")
                x = x + 1: Cells(x, 1) = elem.innerText
            Next elem
    
            html.getElementsByClassName("pagination-next")(0).getElementsByTagName("a")(0).Click
            Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop
    
        Loop Until InStr(html.body.innerHTML, " class=""pagination-last ng-scope disabled""") > 0
        ie.Quit
    End Sub
    
    Sub Get_Content()
    Dim ie作为新的InternetExplorer,html作为HTMLDocument
    调暗itm作为对象、post作为对象、post作为对象、elem作为对象
    与ie
    .Visible=True
    .导航“https://brokercheck.finra.org/"
    直到.readyState=readyState\u完成:循环
    设置html=.document
    以
    设置evt=html.createEvent(“keyboardevent”)
    
    Set testtxt = ie.document.getElementsByTagName("a")
    
    If i < pgcount Then
    For d = 1 To testtxt.Length
    If testtxt.Item(d).innerText = i & " of " & pgcount & " pages" Then
    testtxt.Item(d + 1).Click
    Do While ie.Busy Or ie.readyState <> 4
    DoEvents
    Loop
    Exit For
    End If
    Next d
    End If
    
    Sub Get_Content()
        Dim ie As New InternetExplorer, html As HTMLDocument
        Dim itm As Object, post As Object, posts As Object, elem As Object
    
        With ie
            .Visible = True
            .navigate "https://brokercheck.finra.org/"
            Do Until .readyState = READYSTATE_COMPLETE: Loop
            Set html = .document
        End With
    
        Set evt = html.createEvent("keyboardevent")
        evt.initEvent "change", True, False
    
        For Each itm In html.getElementsByTagName("input")
            If InStr(itm.placeholder, "Name or CRD#") > 0 Then
                itm.Value = "Michael John"
                Exit For
            End If
        Next itm
        itm.dispatchEvent evt
    
        For Each post In html.getElementsByTagName("input")
            If InStr(post.placeholder, "Firm Name or CRD# (optional)") > 0 Then
                post.Value = "Morgan Stanley"
                Exit For
            End If
        Next post
        post.dispatchEvent evt
    
        html.getElementsByClassName("md-button")(0).Click
        Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop
    
        Do
            For Each elem In html.getElementsByClassName("smaller ng-binding flex")
                x = x + 1: Cells(x, 1) = elem.innerText
            Next elem
    
            html.getElementsByClassName("pagination-next")(0).getElementsByTagName("a")(0).Click
            Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop
    
        Loop Until InStr(html.body.innerHTML, " class=""pagination-last ng-scope disabled""") > 0
        ie.Quit
    End Sub