2017-05-21 81 views
0

在VBA中結合使用selenium編寫爬網程序以解析網頁中不同產品的價格時,執行時會出現問題。當它發現某些價格沒有時,它會中斷。使用「錯誤恢復下一步」我可以得到完整的結果。但是,我希望執行我的代碼而不使用「錯誤恢復下一步」。如果它不是硒,我可以使用長度屬性來擺脫它。但是,硒不支持這一點。希望我可以在這裏有任何解決方法。無法執行我的代碼沒有「出現錯誤繼續下一步」

Sub Redmart_scraping() 
Dim driver As New ChromeDriver 
Dim posts As Object, post As Object 

With driver 
    .get "https://redmart.com/bakery" 
    Set posts = .FindElementsByCss("li.productPreview") 
End With 

On Error Resume Next 

For Each post In posts 
    i = i + 1 
    Cells(i, 1) = post.FindElementByCss("span[class^=ProductPrice__price]").Text 
Next post 
End Sub 

回答

1

可以按如下方式提取價格:

Sub Redmart_scraping() 
Dim driver As New ChromeDriver 
Dim posts As Object 
Dim i As Long 

With driver 
    .get "https://redmart.com/bakery" 
End With 

Columns("A:A").NumberFormat = "[$$-409]#,##0.00" 

For Each posts In driver.FindElementsByClass("productPreview") 
    i = i + 1 
    'Cells(i, 2) = posts.Text 
    For Each Item In Split(posts.Text, vbLf) 
     If InStr(1, Item, "$", vbTextCompare) > 0 Then 
      If InStr(2, Item, "$", vbTextCompare) > 0 Then 
       Cells(i, 1) = Mid(Item, 2, InStr(2, Item, "$", vbTextCompare) - 2) 
      Else 
       Cells(i, 1) = Right(Item, Len(Item) - 1) 
      End If 

     End If 
    Next 
Next 
End Sub 

請注意,posts.Text擁有你需要一個項目的所有信息。所以,除了價格,你可以提取項目名稱,折扣,客戶評級,體重,折扣前價格,保證新鮮日期..取消註釋'Cells(i, 2) = posts.Text,看看你自己。

我將剩下的有趣的工作留給你。祝你好運!

+0

你是不可能的,Tehscript。你讓我傻眼了。我敢打賭,你不會找到一個單獨的線程,提供這樣一個很好的解決方案來解決「錯誤恢復下一個」由vba + selenium發生,至少我沒有。有一天,我會爲你解決一個難題:)。謝謝萬億。 – SIM

+0

謝謝SMth80!總是請回答你的問題!保持良好的工作! – Tehscript

+0

也許我已經成爲你的Tehscript的一個好追隨者。檢查鏈接。 「https://www.dropbox.com/s/2na6nfvipmsobat/For%20Tehscript.txt?dl=0」。順便一提,謝謝你的一切。 – SIM

0
Sub Testing() 
    Dim driver As New WebDriver 
    Dim posts As Object, post As Object 
    dim this as string, that as string 

    Set driver = New WebDriver 
    driver.Start "Phantomjs", "https://redmart.com" 
    driver.get "/bakery" 
    Set posts = driver.FindElementsByXPath("//div[@class='productDescriptionAndPrice']") 
    On Error Resume Next 
    For Each post In posts 
     i = i + 1 
     If Isnull(post.FindElementByXPath(".//h4/a").Text) = True Then 
      this = "" 
     Else 
      this = post.FindElementByXPath(".//h4/a").Text 
     End if 
     Cells(i, 1) = this 

     if IsNull(post.FindElementByXPath(".//span[@class='ProductPrice__price___3BmxE']").Text) = True then 
      that = "" 
     else 
      that = post.FindElementByXPath(".//span[@class='ProductPrice__price___3BmxE']").Text 
     end if 
     Cells(i, 2) = that 
    Next post 
End Sub 

古老的 「空指針」 的滋擾。檢查空值非常重要。有prolly更好的方法來做到這一點,但你得到的點(雙關語意圖)

+0

謝謝道格科茨先生,爲您解答。您提供的代碼無法避免該問題。它遇到第一個空值時就會中斷。但是,您提供的代碼會一直運行,直到值耗盡爲止,因爲「出錯時繼續下一步」也是存在的。 – SIM

+0

@ SMth80然後拿出Error繼續然後呢? –

+0

我首先做了這個先生,並給了你反饋。再次感謝。 – SIM

0

On Error Resume Next只是跳過任何運行時錯誤 - 你是對的不希望通用這一點。

如果你不能阻止在第一時間(用於null通過測試,例如)發生,你應該只爲實際上可以創建這些錯誤代碼的一部分激活On Error Resume Next這些錯誤,並與之後停用On Error Goto 0

裏面這些On Error塊,你也可以明確地測試發生錯誤(因此將被忽略)使用Err對象。這樣你可以重新提出所有你沒有想到的錯誤,只會忽略你所期望的錯誤。 請注意:發生錯誤必須在On Error塊之外完成,但保留塊將重置Err對象。因此,在離開On Error塊後,必須將所有必需的錯誤信息保存在另一個變量(或多個變量)中。

我害怕用VBA提供的錯誤處理的一般搞砸設計,沒有更好的辦法。

相關問題