【发布时间】:2016-10-13 16:01:01
【问题描述】:
经过大量搜索,我正在努力使用 VBA 从下面的 HTML 中抓取数据。具体来说,我试图从下面的 HTML 代码中的每个 class="_Xnb _QJ" 中提取值 'DATA ONE' 和 'DATA THREE':
<div class="results">
<div class="_s2 _wPc">
<div class="_fW _QJ">
<div class="_Xnb _QJ _Z9b">
<div class="_Xnb _QJ">
<div class="_Xnb _QJ">
<div class="_Xnb _QJ">
<a href="//Extracted URL//">
<span class="_fbb">
<img id="uid_3" //Extracted// >
</span>
<span class="_PHb">
<span class="_MHb">DATA ONE</span>
</span>
<span class="_B6e">
<span class="_x2">DATA TWO</span>
<span class="_Fs"> DATA THREE </span>
我一直在尝试使用 getElementsByClassName 来获取“_Xnb _QJ”类的集合,并且对于这些类中的每一个,使用 getElementsByTagName 来搜索“_MHb”和“_FS”。我无法按数字顺序挑选孩子,因为这会在“_Xnb..”类之间发生变化,但我需要的数据始终附有相同的 (_MHb/FS) 类标签。
我是 VBA/HTML 的新手,所以这段代码主要是通过在 stackoverflow 上的其他地方编辑示例来组装的。我想知道我需要的类在“href”内而不是在 _Xnb 类的正下方这一事实是否是我无法提取正确数据的原因?
下面我的 VBA 代码的相关部分 - 当我运行它时,代码似乎运行良好,但没有收集数据。
Dim RowNumber As Long
Dim DataOne As String
Dim DataThree As String
Dim QuestionList As IHTMLElementCollection
Dim Question As IHTMLElement
Dim QuestionFields As IHTMLElementCollection
Dim QuestionField As IHTMLElement
RowNumber = 1
Set QuestionList = html.getElementsByClassName("_Xnb _QJ")
For Each Question In QuestionList
Set QuestionFields = Question.getElementsByTagName("SPAN")
For Each QuestionField In QuestionFields
If QuestionField.className = "_MHb" Then
DataOne= QuestionField.innerText
Cells(RowNumber, 1).Value = DataOne
End If
If QuestionField.className = "_Fs" Then
DataThree = QuestionField.innerText
Cells(RowNumber, 2).Value = DataThree
End If
Next QuestionField
RowNumber = RowNumber + 1
Next
Set html = Nothing
MsgBox "Done!"
End Sub
任何帮助将不胜感激。
非常感谢
【问题讨论】:
-
编辑:使用 F8 浏览代码而不是只执行整个 Sub 实际上似乎可以使用上面编写的代码....任何想法为什么会发生这种情况?
-
上面部分显示的代码: Enum READYSTATE READYSTATE_UNINITIALIZED = 0 READYSTATE_LOADING = 1 READYSTATE_LOADED = 2 READYSTATE_INTERACTIVE = 3 READYSTATE_COMPLETE = 4 End Enum Sub ImportData() Dim ie As InternetExplorer Dim html As HTMLDocument Cells.Clear Set ie = New InternetExplorer ie.Visible = True ie.navigate "//URL HERE EXTRACTED//" Do While ie.READYSTATE READYSTATE_COMPLETE Application.StatusBar = "正在尝试加载..." DoEvents Loop Set html = ie.document Set ie =无 Application.StatusBar = ""