2017-08-15 189 views
1

我正在从一个网站收集数据的Excel工作表。关于这个网站的几句话:
- 它是从我独立的,我不能改变它的结构
- 它应该看起来像一个表,但它不是。结构是这样的:vba:getElementsByClassName与不同的类名

<h4>blabla</h4><span class="address">blabla</span><span class="state_x">blabla</span> 
<h4>blabla</h4><span class="address">blabla</span><span class="state_x">blabla</span> 
<h4>blabla</h4><span class="address">blabla</span><span class="state_y">blabla</span> 

诀窍是“state_?”类,它的名字可以改变(但只有结束)。

我现在在做什么?
- 收集所有的数据到数组
- 当然我会得到“state_x”和“state_y”阵列
- 经过阵列,写一切片

问题: 当我到“国家?”数组,我已经不知道,它的数据来自何处。 最好的办法是只有一个“状态”数组,它可以从任何“state_?”收集数据。类。当然这个代码不起作用,但是要显示逻辑:

Dim state As Variant 
Set state = ieApp.Document.getElementsByClassName("state_*") 

这怎么可能工作?任何帮助表示赞赏,请考虑,我是新vba。

新INFOS

我发现通过分析源代码的HTML一些进一步的帮助。每行嵌套在<div class="listitem"> </div>中。是否可以创建一个数组,其中每个元素都是一个完整的“listitem”div,并且用for循环从上面的这些元素中提取数据?

每个“listitem”div只能包含一个“state_?”类。所以这样我就不会丢失数据来源的信息。

+1

尝试跨度或h的的getElementsByTagName,然后看看该对象的类名通过遍历集合从的getElementsByTagName –

回答

0

尝试使用选择器例如querySelectorAll"*[class^='state_']"它应该选择所有具有以文本state_开头的类名称的元素。更多关于选择器here。 HTH

Dim states As IHTMLDOMChildrenCollection 
Set doc = ie.document 
Set states = doc.querySelectorAll("*[class^='state_']") 

If (Not states Is Nothing) Then 
    Dim i 
    For i = 0 To states.Length - 1 
    Debug.Print states(i).innerHTML 
    Next i 
End If  
+0

回来我一直在读书,并努力,其实我喜欢选择的想法。但是,因为我正在使用querySelectorAll(即使使用简单的选择器)或getElementsByClassName与任何类型的复杂选择器,“状态”数组仍然是空的。 – barathg

+0

你确定,那些元素在你执行VBA代码时真的被加载并且是DOM的一部分吗? – dee

+0

如果我运行这个:'Dim state1 As Variant Set state1 = ieApp.Document.getElementsByClassName(“state_x”)Dim state2 As Variant 'Set state2 = ieApp.Document.getElementsByClassName(“state_y”)'它收集所有的数据。但进入两个阵列... – barathg