VBA - 查找前面的html标记

时间:2014-01-03 20:33:59

标签: html excel vba excel-vba

假设我有一个看起来像这样的HTML源代码

<div id="book-info"> 
  <span class="title">Weather</span>
  <span class="title">Title Of Book</span>
  <p><a href="http://test.com?MMC_ID=34343">Buy Now</a></p>
</div>

我需要的是“书名”

有很多span class =“title”的实例,但是我需要的那个实例紧接在页面上唯一的MMC_ID标记之前,所以我可以使用MMC_ID作为标记来接近我需要的span标记。

问题:如何说“抓取MMC_ID左侧第一个span标记的内容?

下面的代码有时会起作用,但页面上有一个可变数量的span标记,因此当出现偏差时它会失败。

With CreateObject("msxml2.xmlhttp")
    .Open "GET", ActiveCell.Offset(0, -1).Value, False
    .Send
    htm.body.innerhtml = .ResponseText
End With

ExtractedText = htm.getElementById("book-info").getElementsByTagName("span")(1).innerText

3 个答案:

答案 0 :(得分:3)

这应该这样做

Text_1 = htm.getElementById("book-info").innerhtml
if instr(1, text_1, "MMC_ID ", vbTextCompare) > 0 then
   numb_spans = htm.getElementById("book-info").getElementsByTagName("span").length
   ExtractedText = htm.getElementById("book-info").getElementsByTagName("span")(-1 + numb_spans).innerText
else
end if

答案 1 :(得分:2)

当下一个兄弟的下一个兄弟的孩子是一个锚元素并且包含正确的文本时,你可以循环遍历所有跨度并停止。

Sub test()

    Dim htm As HTMLDocument
    Dim ExtractedText As String
    Dim hSpan As HTMLSpanElement
    Dim hAnchor As HTMLAnchorElement

    Set htm = New HTMLDocument

    With CreateObject("msxml2.xmlhttp")
        .Open "GET", "file://///99991-dc01/99991/dkusleika/My%20Documents/test.html", False
        .Send
        htm.body.innerHTML = .ResponseText
    End With

    For Each hSpan In htm.getElementById("book-info").getElementsByTagName("span")
        On Error Resume Next
            Set hAnchor = hSpan.NextSibling.NextSibling.FirstChild
        On Error GoTo 0

        If Not hAnchor Is Nothing Then
            If InStr(1, hAnchor.href, "MMC_ID", vbTextCompare) > 0 Then
                ExtractedText = hSpan.innerText
                Exit For
            End If
        End If
    Next hSpan

    Debug.Print ExtractedText

End Sub

答案 2 :(得分:0)

它始终是最后 span元素吗?如果是这样,只需计算多少元素

htm.getElementById("book-info").getElementsByTagName("span")

返回并抓住最后一个。