VBA – 查找前面的html标签

假设我有看起来像这样的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标记。

问题:怎样才能说:“把第一个span标签的内容抓到MMC_ID的左边?

下面的代码有时会起作用,但页面上的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 

这应该做到这一点

 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 

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

 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 

它总是最后的 span元素吗? 如果是的话,只需要统计多less个元素

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

返回并抓住最后一个。