2017-05-21 2 views
0

Schreiben eines Crawlers in VBA in Kombination mit Selen, um den Preis von verschiedenen Produkten von einer Webseite zu analysieren, bekomme ich ein Problem bei der Ausführung. Es bricht, wenn bestimmte Preise keine sind. Mit "bei Fehler resume next" kann ich die vollständigen Ergebnisse erhalten. Ich möchte jedoch meinen Code ausführen, ohne "bei Fehler fortsetzen nächsten" zu verwenden. Wenn es nicht für Selen wäre, hätte ich die Eigenschaft Length verwenden können, um das zu beseitigen. Aber Selen unterstützt das nicht. Ich hoffe, ich kann hier Abhilfe schaffen.Kann meinen Code nicht ausführen, ohne "bei Fehler fortsetzen nächsten"

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 

Antwort

1

können Sie die Preise extrahieren wie folgt:

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 

Bitte beachten Sie, dass posts.Text alle Informationen hält Sie für einen Artikel benötigen. Neben dem Preis können Sie Artikelname, Rabatt, Kundenbewertungen, Gewicht, Preis vor Rabatt und garantierte neue Daten extrahieren. Kommentieren Sie 'Cells(i, 2) = posts.Text und sehen Sie selbst.

Ich lasse Rest der Spaßarbeit zu Ihnen. Viel Glück!

+0

Sie sind unmöglich, Tehscript. Du hast mich nur sprachlos gemacht.Ich wette, Sie werden keinen einzigen Thread finden, wo solch eine wundervolle Lösung zur Verfügung gestellt wurde, um "auf Fehler fortzufahren", die von VBA + Selen aufgetreten ist, zumindest habe ich nicht. Eines Tages werde ich ein schwieriges Problem finden, das du lösen kannst :). Danke eine Billion. – SIM

+0

Danke SMth80! Immer ein bitte, um Ihre Fragen zu beantworten! Mach weiter so! – Tehscript

+0

Vielleicht bin ich ein guter Anhänger von dir geworden, Tehscript. Überprüfen Sie den Link. "https://www.dropbox.com/s/2na6nfvipmsobat/For%20Tehscript.txt?dl=0". Danke für alles, übrigens. – 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 

Das Alter altes "Null-Zeiger" Ärgernis. Die Überprüfung auf Nullen ist wichtig. Es gibt prolly eine bessere Möglichkeit, dies zu tun, aber Sie bekommen den Punkt (Wortspiel beabsichtigt)

+0

Danke Sir Doug Coats, für Ihre Antwort. Der von Ihnen bereitgestellte Code kann das Problem nicht vermeiden. Es bricht, wenn es den ersten Nullwert trifft. Der von Ihnen bereitgestellte Code wird jedoch solange ausgeführt, bis der Wert erschöpft ist, da auch "bei Fehler fortsetzen" angezeigt wird. – SIM

+0

@ SMth80 dann herausnehmen auf Fehler resume nächsten dann? –

+0

Ich habe diesen Sir an erster Stelle und gab Ihnen die Rückmeldung. Danke noch einmal. – SIM

0

On Error Resume Next überspringt nur irgendwelche Laufzeitfehler - Sie haben Recht, dies nicht im Allgemeinen anwenden wollen.

Wenn Sie nicht diese Fehler von dem Auftreten in erster Linie (durch Tests für null, zum Beispiel) verhindern Sie On Error Resume Next nur für den Teil des Codes aktivieren sollen, die tatsächlich können diese Fehler erstellen und es direkt nach der Deaktivierung mit On Error Goto 0.

Innerhalb dieser On Error Blöcke können Sie auch testen explizit die Fehler aufgetreten ist (und daher ignoriert werden) unter Verwendung des Err Objekt. Auf diese Weise können Sie alle Fehler, die Sie nicht erwartet haben, erneut auslösen und nur diejenigen ignorieren, die Sie erwartet haben. Vorsicht: Ein Fehler muss außerhalb eines On Error Blocks ausgelöst werden, aber wenn der Block verlassen wird, wird das Err Objekt zurückgesetzt. Daher müssten Sie alle notwendigen Fehlerinformationen in einer anderen Variablen (oder Variablen) speichern, um darauf zuzugreifen, nachdem Sie den On Error-Block verlassen haben.

Ich fürchte, mit dem allgemeinen durcheinander geratenen Design der Fehlerbehandlung von VBA gibt es keinen besseren Weg.

Verwandte Themen