如何在div之间获取文本而没有任何标签? <div class =“ obj-amount”> 15 </div>

时间:2019-07-06 07:10:03

标签: html excel vba web-scraping

我在VBA中有此代码,我想提取obj-amount div类的'15'。有什么建议吗?

<div class="obj-amount">15<span class="unit">$</span></div>
Set divtags = oHtml.getElementsByClassName("obj-amount")(0).getElementsByTagName("obj-amount")
i = 0
For Each oElement In divtags
    Sheets("Data").Range("A" & i + 1) = divtags(i).innerText
    i = i + 1
Next oElement

1 个答案:

答案 0 :(得分:0)

返回收藏夹并循环播放:

您不想将ByClassNameByTagName链接在一起。您内部的选择器仅用于类名,足以返回具有该类名的元素的集合。

如果在所有具有该类名称的元素之后进行循环,则也不想在该级别建立索引。您想For Each浏览集合。然后在循环中,您要使用循环变量oElement;这意味着您可以启动i=1并减少代码量并减少循环调用。

这当然会返回位于子$标记中的span


避免/删除$(或子span内容)的方法:

  1. 如果不需要,最简单的方法是在循环过程中在Replace$上使用.innerText
  2. 如果该文本不是恒定的,则可以用oElement.children(0).innerText上的vbNullString.innerText替换oElement.getElementsByTagName("span")(0).innertext。我认为后者可能是您所做的事情(但必须在循环中。)。
  3. 您也可以不用更换而完成oElement.FirstChild.NodeValue

N.B。

您可以使用哪种方法取决于声明divtagsoElement的方式。


长文本版本:

Set divtags = ohtml.getElementsByClassName("obj-amount") '<== collection matched by classname
i = 1
For Each oElement In divtags                 '<== loop each item in collection
    Worksheets("Data").Range("A" & i) = oElement.innerText
    'Worksheets("Data").Range("A" & i) = oElement.FirstChild.NodeValue
    'Worksheets("Data").Range("A" & i) = Replace$(oElement.innerText,"$", vbNullString)  '<==replacement if wanted
    'Worksheets("Data").Range("A" & i) = Replace$(oElement.innerText,oElement.children(0).innerText, vbNullString)  '<==replacement if wanted and first child text not constant
    'Worksheets("Data").Range("A" & i) = Replace$(oElement.innerText,oElement.getElementsByTagName("span")(0).innertext, vbNullString)  '<==replacement if wanted and child span text not constant
    i = i + 1
Next oElement

使用With语句和Worksheet变量以提高可读性:

我可能会将工作表放入变量中,并确保我正在使用Worksheets集合。我还可以使用With语句在循环内保存对oElement的引用,以便使用点访问器.来提高可读性:

Dim ws As Worksheet

Set ws = ThisWorkbook.Worksheets("Data")
Set divtags = ohtml.getElementsByClassName("obj-amount") 
i = 1
For Each oElement In divtags  
    With oElement
        ws.Range("A" & i) = .FirstChild.NodeValue
        ws.Range("A" & i) = Replace$(.innerText, "$", vbNullString) 'next two lines are alternativeS based on need
        ws.Range("A" & i) = Replace$(.innerText, .Children(0).innerText, vbNullString)
        ws.Range("A" & i) = Replace$(.innerText, .getElementsByTagName("span")(0).innerText, vbNullString) 
    End With
    i = i + 1
Next oElement