2017-05-21 86 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提供的错误处理的一般搞砸设计,没有更好的办法。

相关问题