2017-09-11 75 views
-4

我已经创建了一个vba中的刮板结合硒来解析网页中的不同公司名称。该页面已经遍历了56个可以使用前进按钮到达的页面。我的刮板目前能够在do循环的帮助下抓取这57页中的所有数据。但是,我在这里面临的问题是,当完成收集所有数据时,我的脚本无法摆脱循环。这是因为我在循环中使用了“Do while True”条件。我应该在这种情况下做什么,以便我的脚本能够在完成时打破循环并退出浏览器?提前致谢。如何在完成时打破循环?

这是我到目前为止已经写的:

Sub jscriptinjected_data() 

    Dim driver As New ChromeDriver 
    Dim posts As Object, post As Object 

    With driver 
      .Get "http://registers.centralbank.ie/FundSearchResultsPage.aspx?searchEntity=FundServiceProvider&searchType=Name&searchText=&registers=6%2c29%2c44%2c45&AspxAutoDetectCookieSupport=1" 

     Do While True 
      Set posts = .FindElementsByClass("entityNameColumn") 
      For Each post In posts 
       x = x + 1: Cells(x, 1) = post.FindElementByTag("a").Text 
      Next post 
      .FindElementById("ctl00_cphRegistersMasterPage_gvwSearchResults_ctl18_btnNext").Click 
     Loop 
    End With 

    driver.Quit 
End Sub 
+0

'退出做'当'帖子'是'没有'?删除'While True'并添加'Loop Until posts is Nothing'? – GSerg

+0

顺便说一下,当它碰到包含'click'选项的行时,就会抛出错误。 – SIM

+1

将常识应用于以前的建议?如果'posts'永远不是'Nothing',而是测试它所具有的意味着它是空的? – GSerg

回答

4

As GSerg suggested,爆发时posts Is Nothing - 如果API抛出一个错误时,有“没有这样的元素”,然后处理它!

Do While True...Loop构造只是奇怪;如果你需要一个无限循环只是做Do...Loop

Do 
    Set posts = .FindElementsByClass("entityNameColumn") 
    '... 
    On Error Resume Next 
    .FindElementById("ctl00_cphRegistersMasterPage_gvwSearchResults_ctl18_btnNext").Click 
    If Err.Number <> 0 Then Exit Do 
    On Error GoTo 0 

Loop 
+0

应在'.FindElementById(“ctl00_cphRegistersMasterPage_gvwSearchResults_ctl18_btnNext”)处捕获错误。单击它出现的位置,因为在最后一页没有下一页。 – BitAccesser

+0

无论如何。相同的想法/原则。 –

+0

是的,但是你的代码不会在'On Error GoTo 0'后出现错误。 – BitAccesser