VBA 从跨度类中提取值

Ian*_*anG 5 html excel vba web-scraping

我正在使用 vba 从 HTML 中提取值,.getElementsByClassName但目前运气不佳。

我正在尝试从以下 HTML 中提取“20+”

<p class="delivery-stock">
    <span class="delivery-stock-value">20+</span> 
    <span class="delivery-available f-bold f4">available for delivery:</span>
</p>
<p>
Run Code Online (Sandbox Code Playgroud)

到目前为止我使用的 VBA 是

sh01.Cells(r, 5) = HTML.getElementsByClassName("delivery-stock-value")(0).innertext
sh01.Cells(r, 5) = HTML.getElementsByClassName("delivery-stock-value")(0).value
Run Code Online (Sandbox Code Playgroud)

我也用这个delivery-stock类做了同样的事情。

delivery-stock-value&delivery-stock在 HTML 中只出现一次。

在此先感谢您的帮助。

Rya*_*dry 5

这是一个小示例,它应该将文本返回到 Sheet1 中的单元格 A1。你想要的outerText财产。这仅用于演示目的,如果您希望它更快且更易于维护,请使用 Web 请求。

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub GetTheText()
    Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sheet1")
    Dim text As String

    With CreateObject("internetexplorer.application")
        .Navigate "https://www.toolstation.com/2-column-radiator/p39711"
         Do While .Busy And .readyState <> 4:DoEvents:Loop
         Sleep 1000 ' wait a little bit too
         text = .document.getElementsByClassName("delivery-stock-value")(0).outerText
        .Quit
    End With

    ws.Cells(1, 1).Value = text
End Sub
Run Code Online (Sandbox Code Playgroud)


QHa*_*arr 2

如果可用,请使用 API。在这种情况下,您可以将股票代码传递到一个 API。这样更加高效、可靠。

使用 JSONParser(推荐):

如果您想要 JSON 解析器(例如jsonconverter.bas)的安全性,则如下所示。将 .bas 添加到项目后,转到 vbe > 工具 > 引用并添加引用Microsoft Scripting Runtime

Public Sub GetStock()
    Dim json As Object
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://www.toolstation.com/api/products/39711/delivery?site=WW", False
        .send
        Set json = JsonConverter.ParseJson(.responseText)
    End With
    Debug.Print json("data")("channels")("delivery")("stock")
End Sub
Run Code Online (Sandbox Code Playgroud)

没有 JSON 解析器(不推荐):

Public Sub GetStock()
    Dim sResponse As String
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://www.toolstation.com/api/products/39711/delivery?site=WW", False
        .send
        sResponse = .responseText
    End With
    Debug.Print Split(Split(sResponse, "stock" & Chr$(34) & ":")(1), ",")(0)
End Sub
Run Code Online (Sandbox Code Playgroud)