我有以下html部分
<div class="description">
<span>Brand:</span>
<a href="http://www.bestfamily.gr">Nikon</a><br/>
<span>Product Code:</span> 130342 <br/>
<span>Barcode</span> 18208948581 <br/>
<span>Availability:</span>Available</div>
我正在尝试使用以下命令获取最后一个跨度和可用字样
Set availability = ie.Document.getElementsByClassName(".description").getElementsByTagName("span")(2)
wks.Cells(i, "D").Value = availability.innerText
但是它显示所有跨度文本 我在这里做错了什么?
答案 0 :(得分:1)
在last-child中将descendant combination css伪类与父元素class selector一起使用。
.description span:last-child
:last-child CSS伪类表示一个元素中的最后一个元素 一组同级元素。
正在应用:
单场比赛
Set availability = ie.document.querySelector(".description span:last-child")
Cells(1,1) = availability.innerText
所有比赛
Set availability = ie.document.querySelectorAll(".description span:last-child")
Cells(1,1) = availability.item(0).innerText
否则,您可以从该父类返回span集合并对其进行索引
Set availability = ie.document.querySelectorAll(".description span")
Cells(1,1) = availability.item(2).innerText '<==choose your index here
甚至连锁:
Set availability = ie.document.querySelector(".description span + span + span") '<==expand as required. This uses [adjacent sibling combinator][4].
遗憾的是,VBA实现不支持伪类nth-of-type / nth-child,尽管您可以使用许多其他语言,例如python。
-
如果仅在可用之后,您应该可以使用.description作为选择器来返回div中的所有文本。然后使用Chr $(32)在.innerText上使用Split进行拆分并提取UBound(即生成的数组的最后一个元素)
Set availability = ie.document.querySelector(".description")
Dim arr() As String
arr = split( availability.innerText, ":")
Cells(1,1) = arr(UBound(arr))
答案 1 :(得分:0)
正如Zac在评论中指出的那样,您不应该在.
方法中使用句点getElementsByClassName
。
ie.Document.getElementsByClassName
返回元素的DispHTMLElementCollection。您需要指定要引用的元素
设置可用性= ie.Document.getElementsByClassName(“。description”)(0).getElementsByTagName(“ span”)(2)
编写代码的更好方法是引用Microsoft HTML对象库并创建一个变量来测试返回的每个元素。不幸的是,DispHTMLElementCollection
实现中存在错误,因此您将需要使用Object而不是DispHTMLElementCollection
。
Dim doc As HTMLDocument Dim availability As Object Set doc = ie.Document Set availability = doc.getElementsByClassName("description") Dim div As HTMLDivElement Dim span As HTMLSpanElement Dim spans As Object For Each div In availability Set spans = div.getElementsByTagName("span") For Each span In spans Debug.Print span.innerText Next Next