【问题标题】:How to get text between div without any tag? <div class="obj-amount">15</div>如何在没有任何标签的div之间获取文本? <div class="obj-amount">15</div>
【发布时间】:2019-11-16 14:46:22
【问题描述】:

我在 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

【问题讨论】:

  • 你从哪里得到 15?解释你的代码位
  • 嗨,Irin,这是我需要提取的信息。它是产品的价值,它可能会有所不同。 TIA。

标签: html excel vba web-scraping


【解决方案1】:

返回一个集合并循环:

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

您也不想在该级别索引,如果所有元素都具有此类名称的循环。你想For Each 收藏。然后在循环中你想使用循环变量oElement;这意味着您可以启动 i=1 并减少代码量和循环中的添加调用。

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


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

  1. 如果不需要,最简单的删除方法是在循环期间在.innerText 上使用Replace$
  2. 如果该文本不是常量,那么您可以在.innerTextoElement.getElementsByTagName("span")(0).innertext 上将oElement.children(0).innerText 替换为vbNullString。我认为后者可能是你在做的事情(但它需要在循环中。)。
  3. 您也可以在不替换的情况下完成 oElement.FirstChild.NodeValue

注意

您可以使用哪些方法取决于您声明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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多