如下图我要取得当前元素a的值67896.由于这个网页不是很标准..值没有包含在元素里,无法直接取到。当然要是用正则或者split这种肯定是能解决的。 我这里只是学习下jquery的解法。
StrText="<a><span>123</span>67896<span>876</span></a>"
1.我先是用了$('a').text().因为加载的是网络的jquery,第一次运行代码可能会报错,因为要下载js文件,第二次以后直接用缓存了,不会报错。当然你可以把jquery文件放到vba代码所在工作簿的文件夹,然后本地引用也可以。如:Odom.write "<script src='" & ThisWorkbook.Path & "\jquery-1.4.min.js'></script><body></body>",这样就可以了。代码如下,然而并未得到预期的结果:
Sub Test1()
Dim Odom As Object, oWindow As Object, StrText As String
Set Odom = CreateObject("htmlfile")
Set oWindow = Odom.parentWindow
StrText = "<a><span>123</span>67896<span>876</span></a>"
Odom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
Odom.body.innerHTML = StrText
MsgBox oWindow.eval("$('a').text()")
End Sub
运行后结果是把所有的包括后代的值都包含在里面了:
然后我又研究学习了下:利用删除后代的方法,找到当前元素的值。jquery写法:$('a').children().remove().end().text().这个在后代比较多的时候应该效率是比较低的。不过vba里面也是够用了,呵呵,解决了问题就是好的。完整的代码如下:
Sub Test2()
Dim Odom As Object, oWindow As Object, StrText As String
Set Odom = CreateObject("htmlfile")
Set oWindow = Odom.parentWindow
StrText = "<a><span>123</span>67896<span>876</span></a>"
Odom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
Odom.body.innerHTML = StrText
MsgBox oWindow.eval("$('a').clone().children().remove().end().text()")
End Sub
运行结果如下,达到了我想要的结果:
后来学习了下。发现遍历节点就可以实现 我的要求。节点的类型有3类。1表示元素,2表示属性,3表示文本。基本我们需要的就是找到nodetype为3的节点就可以了。实现代码如下,没有使用jQuery的写法:
Sub Test3()
Dim Odom As Object, oWindow As Object, StrText As String
Set Odom = CreateObject("htmlfile")
Set oWindow = Odom.parentWindow
StrText = "<a><span>123</span>67896<span>876</span></a>"
Odom.body.innerHTML = StrText
Set a = Odom.getElementsByTagName("a")(0) '取得节点a
For Each e In a.ChildNodes
If e.NodeType = 3 Then MsgBox e.Data: Exit For
Next
End Sub
下面再写一下jQuery的代码:
Sub Test3()
Dim Odom As Object, oWindow As Object, StrText As String
Set Odom = CreateObject("htmlfile")
Set oWindow = Odom.parentWindow
StrText = "<a><span>123</span>67896<span>876</span></a>"
Odom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
Odom.body.innerHTML = StrText
MsgBox oWindow.eval("$('a').contents().filter(function(){return this.nodeType==3;}).text()")
End Sub
一样得到了我想要的答案。可惜听说jquery黯然落幕了。希望会出现更好的工具吧、