【问题标题】:VBA script to pull values within specific HTML classes用于在特定 HTML 类中提取值的 VBA 脚本
【发布时间】:2015-08-19 21:34:32
【问题描述】:

我创建了一个 VBA 脚本,通过获取 HTML 类中的值来从网站中提取价格。

请参阅VBA Script pull data from website 了解更多信息。

这确实很好用,但是在某些情况下只有 1 个价格(没有 RRP 和销售价格),因此我需要以某种方式合并一个 if 语句来查找类名,如果不存在,请查看另一个。

例如,我有以下电子表格:

| A | B | C |
| | Item | Price |
| | bfd/garden-structures/arbours/arbours-sunflower | |
| | bfd/garden-structures/arbours/tatton-corner-arbour-seat | |
| | bsd/garden-storage/wooden-storage/4-x-2-windsor-garden-storage-chest | |

在此示例中,前 2 个使用以下代码:(查看 int 类 VariantPriceNowValue)但是第 3 个示例不起作用,因为类 VariantPriceNowValue 不存在,但是它确实有 priceSinglePrice 类。

我使用的代码如下:

Sub BuyDeckingDirect()

    Dim ie As New InternetExplorer
    Dim doc As HTMLDocument
    Dim result As IHTMLElement
    Dim result2 As IHTMLElement
    Dim item As String
    Dim lRow As Long

    'ie.Visible = True'
    lRow = 2
    item = Worksheets("BuyDeckingDirect").Range("B" & lRow).Value
    MsgBox "Price Dump Started"
    Do Until item = ""
        ie.navigate "http://www.buydeckingdirect.co.uk/" & item

        Do
            DoEvents
        Loop Until ie.readyState = READYSTATE_COMPLETE

        Set doc = ie.document

        Set result = doc.querySelector(".VariantPrice")
        Set result2 = result.querySelector(".NowValue")

        Worksheets("BuyDeckingDirect").Range("C" & lRow).Value = result2.innerText

        lRow = lRow + 1
        item = Worksheets("BuyDeckingDirect").Range("B" & lRow).Value

    Loop
    MsgBox "BuyDeckingDirect Price Dump Complete"
End Sub

任何帮助将不胜感激!

谢谢

杰斯

【问题讨论】:

    标签: html vba excel if-statement


    【解决方案1】:

    在对querySelector 的调用中结合两个类,如果resultNothing,则使用替代类再次调用它。

    例子:

    ' ...
    Set result = doc.querySelector(".VariantPrice .NowValue")
    If result Is Nothing Then
        Set result = doc.querySelector(".VariantPrice .price")
    End If
    ' You should consider the fact that you can have neither
    If result Is Nothing Then
        Worksheets(...etc...).Value = "N/A"
    Else
        Worksheets(...etc...).Value = result.innerText
    End If
    

    当然你也可以像这样设置result后检查NowValue类的存在:

    ' ...
    Set result = doc.querySelector(".VariantPrice")
    If IsNull(result.querySelector(".NowValue")) Then
        Set result2 = result.querySelector(".price")
    Else
        Set result2 = result.querySelector(".NowValue")
    End If
    

    就个人而言,我更喜欢第一个选项,但这取决于您的用例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多