【问题标题】:VBA to extract value from span classVBA从跨度类中提取值
【发布时间】:2019-01-03 20:11:06
【问题描述】:

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

我正在尝试从以下 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>

我目前使用的 VBA 是

sh01.Cells(r, 5) = HTML.getElementsByClassName("delivery-stock-value")(0).innertext
sh01.Cells(r, 5) = HTML.getElementsByClassName("delivery-stock-value")(0).value

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

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

提前感谢您的帮助。

【问题讨论】:

标签: html excel vba web-scraping


【解决方案1】:

这是一个小例子,它应该将文本返回到 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

【讨论】:

  • 谢谢瑞恩。完美运行。我试图直接从 HTML 中提取,而不是像您的示例中那样加载 url。谢谢你。是否可以从 HTML 中提取或者我必须使用 CreateObject("internetexplorer.application...etc?
  • 在我的示例中,您可以访问 .Document 中的所有 HTML。您可以在With...End With 部分之间找出您需要的内容
【解决方案2】:

如果可用,请使用 API。在这种情况下,您可以将股票代码传递给 API。这更有效、更可靠。

使用 JSONParser(推荐):

如果您想要 JSON 解析器的安全性(例如 jsonconverter.bas),则如下所示。将 .bas 添加到项目后,转到 vbe > tools > references 并添加对 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

没有 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

【讨论】:

  • 谢谢 QHarr。看起来很有趣。还不是我尝试过的方法。今晚我会看看那个。再次感谢。伊恩。
  • API 是一种享受。 -谢谢。我可以看到一个全新的 API 世界在我面前打开。谢谢。
  • 没有问题。 API 是可行的方法。
  • @QHarr 作为您分析 http 请求部分的替代方法,您可以使用 WorksheetFunction.FilterXML(sResponse, "//span[@class='delivery-stock-value']"), if sResponse` 返回格式良好的 xml 结构。 `
猜你喜欢
  • 2016-10-13
  • 2021-10-08
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多