我有一个搜索页面,结构如下。页面上最多有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
答案 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 表示集合中没有任何内容。