【发布时间】:2021-10-30 21:08:37
【问题描述】:
我有一个MSHTML.HTMLDocument 代码:
-
打开页面
"https://www.ksestocks.com/HistoryHighLow" -
填充输入,即
786 -
然后点击按钮获取表格
-
我使用以下代码捕获了一行及其 4 个孩子
Sub KSE_GetHTMLDocument() Dim IE As New SHDocVw.InternetExplorer Dim HTMLDOC As MSHTML.HTMLDocument Dim HTMLInput As MSHTML.IHTMLElement Dim HTMLClasses As MSHTML.IHTMLElementCollection Dim HTMLClass As MSHTML.IHTMLElement Dim HTMLCel As MSHTML.IHTMLElement Dim colNum, rowNum, RowN, C As Integer Dim Cel As Range IE.Visible = False IE.Navigate "https://www.ksestocks.com/HistoryHighLow" Do While IE.ReadyState <> READYSTATE_COMPLETE Loop For Each Cel In Sheets("Sheet1").Range("A3:A" & Cells(Rows.Count, 1).End(xlUp).Row) If IsEmpty(Cel.Value) = False Then Set HTMLDOC = IE.Document Set HTMLInput = HTMLDOC.getElementById("selscrip") HTMLInput.Value = Trim(Cel.Value) Debug.Print Cel.Value HTMLDOC.getElementsByTagName("input")(0).Click While IE.Busy Or IE.readyState < 4: DoEvents: Wend C = 0 For Each HTMLClass In HTMLDOC.getElementsByTagName("tr") If InStr(HTMLClass.innerText, "Last 3 years (") > 0 Then If Left(HTMLClass.innerText, 14) = "Last 3 years (" Then For Each HTMLCel In HTMLClass.Children Debug.Print HTMLCel.innerText If C = 1 Then Cel.Offset(0, 7).Value = HTMLCel.innerText ElseIf C = 2 Then Cel.Offset(0, 8).Value = HTMLCel.innerText ElseIf C = 3 Then Cel.Offset(0, 9).Value = HTMLCel.innerText ElseIf C = 4 Then Cel.Offset(0, 10).Value = HTMLCel.innerText End If C = C + 1 Next End If End If Next End If Next End Sub
上面的代码在从网站获取值时运行良好,但是当我将代码更改为 XML 时,它停止工作,并且 Internet Explorer 每次都弹出一个新窗口,但没有结果。
我哪里做错了?
有没有更健壮的网页抓取方式?
运行前请检查以下代码
Sub KSE_Get_XML()
Dim XMLp As New MSXML2.XMLHTTP60
Dim HTMLDOC As New MSHTML.HTMLDocument
Dim HTMLInput As MSHTML.IHTMLElement
Dim HTMLClasses As MSHTML.IHTMLElementCollection
Dim HTMLClass As MSHTML.IHTMLElement
Dim HTMLCel As MSHTML.IHTMLElement
Dim colNum, rowNum, RowN, C As Integer
XMLp.Open "GET", "https://www.ksestocks.com/HistoryHighLow", False
XMLp.send
HTMLDOC.body.innerHTML = XMLp.responseText
Dim Cel As Range
' Do While HTMLDOC.ReadyState <> READYSTATE_COMPLETE
' Loop
For Each Cel In Sheets("Sheet1").Range("A3:A" & Cells(Rows.Count, 1).End(xlUp).Row)
If IsEmpty(Cel.Value) = False Then
HTMLDOC.body.innerHTML = XMLp.responseText
Set HTMLInput = HTMLDOC.getElementById("selscrip")
HTMLInput.Value = Trim(Cel.Value)
Debug.Print Cel.Value
HTMLDOC.getElementsByTagName("input")(0).Click
'Application.Wait Now + TimeValue("00:00:01")
'' Do While HTMLDOC.ReadyState <> READYSTATE_COMPLETE
' DoEvents
' Loop
C = 0
For Each HTMLClass In HTMLDOC.getElementsByTagName("tr")
If InStr(HTMLClass.innerText, "Last 3 years (") > 0 Then
If Left(HTMLClass.innerText, 14) = "Last 3 years (" Then
For Each HTMLCel In HTMLClass.Children
Debug.Print HTMLCel.innerText
If C = 1 Then
Cel.Offset(0, 7).Value = HTMLCel.innerText
ElseIf C = 2 Then
Cel.Offset(0, 8).Value = HTMLCel.innerText
ElseIf C = 3 Then
Cel.Offset(0, 9).Value = HTMLCel.innerText
ElseIf C = 4 Then
Cel.Offset(0, 10).Value = HTMLCel.innerText
End If
C = C + 1
Next
End If
End If
Next
End If
Next
End Sub
【问题讨论】:
标签: html xml vba web-scraping xslt