如果元素存在,使用Excel VBA获取web元素,否则跳过

时间:2015-07-11 12:23:41

标签: excel vba web getelementbyid

我是擦洗网页的新手,但我对它有所了解。我已成功使用以下命令从网页获取数据:

sht.Range("b" & RowCount).Value = .document.getElementById("PriceLabel").getElementsByTagName("span")(3).innerText
sht.Range("c" & RowCount).Value = .document.getElementById("QuantityInput").Value

我的挑战是,我搜索的所有网页都不具备这些元素,因此脚本会因运行时错误424 - 需要对象而停止。

我尝试过On Error GoTo命令,但这只适用于第一个事件,然后在第二个网页上停止并显示缺少的元素。

该代码是:

Next_sku:
Do
    RowCount = RowCount + 1
    SKU = sht.Range("a" & RowCount).Value

    With ie
    .Visible = False
    .navigate "http://www.staples.no/search?keywords=" & SKU

        Do While .Busy Or _
            .readyState <> 4
            DoEvents
        Loop

    sht.Range("b" & RowCount).Value = .document.getElementById("PriceLabel").getElementsByTagName("span")(3).innerText
    sht.Range("c" & RowCount).Value = .document.getElementById("QuantityInput").Value
    On Error GoTo Next_sku

    End With

Loop While sht.Range("a" & RowCount + 1).Value <> ""

任何人都可以帮我一个代码,它会返回一个空白结果,手动输入如f.eks“不存在”og只是跳到下一个命令行,如果元素是不存在的话。最重要的是脚本不会停止。

谢谢: - )

2 个答案:

答案 0 :(得分:1)

我认为问题是您的代码没有从第一个错误中恢复。您无法在错误处理程序中检查错误。通过在代码中添加resume语句,VBA将不再认为您在错误处理程序中,并且您的代码将恢复正常。

以下是一个例子:

On Error GoTo Next_sku
   sht.Range("b" & RowCount).Value = .document.getElementById("PriceLabel").getElementsByTagName("span")(3).innerText
   sht.Range("c" & RowCount).Value = .document.getElementById("QuantityInput").Value
Next_sku:
   'Do something on error
Resume Next

如果找不到SKU,上面的代码将留下空白结果。您可以在Next_sku:标签后添加代码以返回&#34;不存在&#34;。

您也可以尝试使用on error resume next声明。

答案 1 :(得分:0)

非常感谢@Hubvill寻找答案。

代码On Error Resume Next解决了这个问题。我的代码现在如下所示:

Do
    RowCount = RowCount + 1
    SKU = sht.Range("a" & RowCount).Value

    With ie
    .Visible = False
    .navigate "http://www.staples.no/search?keywords=" & SKU

        Do While .Busy Or _
            .readyState <> 4
            DoEvents
        Loop

    sht.Range("b" & RowCount).Value = .document.getElementById("PriceLabel").getElementsByTagName("span")(3).innerText
    sht.Range("c" & RowCount).Value = .document.getElementById("QuantityInput").Value
    On Error Resume Next

    End With

Loop While sht.Range("a" & RowCount + 1).Value <> ""

结果是将该字段留空,并继续沿着列表og SKU查找并抓取数据给他们。

卓越的解决方案。