2017-05-21 6 views
0

VBAでクローラを作成して、Webページからさまざまな製品の価格を解析すると、実行時に問題が発生します。それは、特定の価格がどれも見つからないときに壊れます。 「次回エラー時に再開」を使用すると、完全な結果を得ることができます。しかし、私は "on error resume next"を使わずにコードを実行したい。それがセレンのためでなければ、私は長さのプロパティを使用してそれを取り除くことができました。しかし、セレンはそれをサポートしていません。私はここで任意の回避策を取ることができることを望む。"エラーが発生したときに次回に再開"せずにコードを実行できません

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を使用すると、1つの項目に必要なすべての情報を保持していることに注意してください。価格のほかに、商品名、割引、顧客評価、重量、割引前の価格、新鮮な日付を抽出することができます。'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 

年齢古い "ヌルポインタ" 迷惑。ヌルをチェックすることは重要です。これを行うためのより良い方法がありますが、あなたはポイントを得ることができます。

+0

お返事ありがとうございました。あなたが提供したコードは、問題を避けることはできません。それが最初のヌル値に達すると、ブレークします。しかし、 "on error resume next"もそこにあるので、あなたの提供されたコードは、値がなくなるまで実行されます。 – SIM

+0

@ SMth80その後、次のエラーを再開しますか? –

+0

私は最初にその先生をしてフィードバックをくれました。再度、感謝します。 – SIM

0

On Error Resume Next一般的にこれを適用したくないのは間違いありません。

あなたが唯一の実際これらのエラーを作成することができ、コードのその部分のためOn Error Resume Nextを活性化させる必要があります(例えば、nullのテストで)最初の場所でこれらのエラーが発生しないよう、右の後でそれを無効にすることができない場合On Error Goto 0。これらOn Errorブロックの内部

あなたはまた、明示的Errオブジェクトを使用してエラーが発生した(したがって、無視されます)をテストすることができます。こうすることで、あなたが期待していなかったすべてのエラーを再発生させることができ、期待したエラーだけを無視することができます。 注意:エラーを発生させるには、ブロックOn Errorの外側で行う必要がありますが、ブロックを離れるとErrオブジェクトがリセットされます。したがって、ブロックを終了した後にアクセスするには、必要なエラー情報を別の変数(または変数)に保存する必要があります。

私はVBAで提供されるエラー処理の一般的な設計がうんざりしていることを恐れていますが、それ以上の方法はありません。

関連する問題