VBA:从Div类中的子Div类中提取文本

时间:2015-11-14 19:23:46

标签: html vba text extract

我有一个搜索页面,结构如下。页面上最多有70个 searchRecord 实例。我需要提取由星号***表示的文本,并将它们放入excel中的单独单元格中。所以每个搜索记录都会有一个新行。

<div class="searchRecord">
                <div class="thumb">
                    <a href="**SKU**">
                        <img src="/product_images/.jpg" alt="**Title**" title="**Title**" border="0"  />                        </a>
                </div>
                <div class="desc">
                    <h1><a href="**SKU**">**Title**</a></h1>
                    <p>**Category**</p>
                    <div class="clear"></div>
                    <div align="center">
                        <div style="width:30%">
                            <style>.bv_rating{ margin:3px 0px 0px 30px; }</style><div id='BVRRInlineRating-5030917094484' class="bv_rating"></div>                          </div>
                    </div>
                    <div class="prodPrice">
                        <div style="padding-top: 6px;">
                            <div class="priceTxt">**Price1**</div>
                            <div class="priceTxt">**Price2**</div><br /><div class="priceTxt">**Price3**</div><br />                            </div>
                    </div>
                    <div class="clear"></div>
</div>

我需要提取以下内容:

SKU

标题(有3个可能的例子)

分类

价格1

Price2

Price3

我之前设法让这个工作,但只有当主div类有一个唯一的名字时 - 可以用

完成
Set searchres= oHtml.getElementsByClassName("searchRecord")(0).getElementsByTagName("span")
i = 0
For Each oElement In searchres
 Sheets("Sheet1").Range("A" & i + 1) = searchres(i).innerText
 i = i + 1
Next oElement

1 个答案:

答案 0 :(得分:0)

我一般不喜欢在没有首先测试的情况下提供代码,但由于没有提供正式的URL,唯一的选择是从提供的HTML的短部分构建可维护的网页。

Dim v As Long, vSKUs As Variant
Dim iDIV As Long, pp As Long
Dim oHtml As Object

'at this point oHtml is the HTML body
With oHtml
    If CBool(.getElementsByClassName("searchRecord").Length) Then
        'there is at least one element with the 'searchRecord' class
        'make room for all of the array elements
        ReDim vSKUs(1 To .getElementsByClassName("searchRecord").Length, 1 To 5)
        For iDIV = 1 To .getElementsByClassName("searchRecord").Length
            With .getElementsByClassName("searchRecord")(iDIV - 1)
                'get the SKU from the anchor, otherwise skip to next
                If CBool(.getElementsBytagName("a").Length) Then
                    With .getElementsBytagName("a")(0)
                        vSKUs(iDIV, 1) = .href
                        'get the title from the anchor's image
                        If CBool(.getElementsBytagName("img").Length) Then
                            vSKUs(iDIV, 2) = .Title
                        End If
                    End With
                    'get up to 3 prices
                    If CBool(.getElementsByClassName("prodPrice").Length) Then
                        For pp = 1 To .getElementsByClassName("prodPrice").Length
                            If pp > 3 Then Exit For  'don't get more than 3
                            vSKUs(iDIV, pp + 2) = .getElementsByClassName("prodPrice")(pp - 1).innertext
                        Next pp
                    End If
                End If
            End With
        Next iDIV
    End If
End With

With Worksheets("Sheet1")
    .Range("A2").Resize(UBound(vSKUs, 1), UBound(vSKUs, 2)) = vSKUs
End With

希望您可以看到使用.Length进行的检查是如何与迭代通过集合一起工作的。请记住,集合中的元素具有基于1的长度,但基于0的索引;例如如果有六个div元素,其类名为 searchRecord ,则该集合的.Length 6 ,但索引为 0 5 即可。 .Length 0 表示集合中没有任何内容。