Vba 将IE自动化代码更改为XML时出错
我最近开始使用XML自动化,在修改了一些基本的IE自动化代码之后,我似乎遇到了一个错误。以下是HTML:Vba 将IE自动化代码更改为XML时出错,vba,excel,internet-explorer,xml-parsing,Vba,Excel,Internet Explorer,Xml Parsing,我最近开始使用XML自动化,在修改了一些基本的IE自动化代码之后,我似乎遇到了一个错误。以下是HTML: <tbody> <tr class="group-2 first"> <td class="date-col"> <a href="/stats/matches/mapstatsid/48606/teamone-vs-merciless"> <div class="time" dat
<tbody>
<tr class="group-2 first">
<td class="date-col">
<a href="/stats/matches/mapstatsid/48606/teamone-vs-merciless">
<div class="time" data-time-format="d/M/yy" data-unix="1498593600000">27/6/17</div>
</a>
</td>
......SOME MORE HTML HERE......
</tr>
......SOME MORE HTML HERE......
</tbody>
为我工作:
Sub readData()
Dim XMLPage As New MSXML2.XMLHTTP60
Dim html As New MSHTML.HTMLDocument, links, a, i
XMLPage.Open "GET", "https://www.hltv.org/stats/matches", False
XMLPage.send
If XMLPage.Status <> 200 Then MsgBox XMLPage.statusText
html.body.innerHTML = XMLPage.responseText
Set links = html.querySelectorAll("td.date-col > a")
Debug.Print links.Length
For i = 0 To links.Length - 1
Debug.Print links(i).href
Next
Set links = Nothing
Set html = Nothing
End Sub
子读取数据()
Dim XMLPage作为新的MSXML2.XMLHTTP60
将html设置为新的MSHTML.HTMLDocument、链接、a、i
XMLPage.Open“GET”https://www.hltv.org/stats/matches”“错
XMLPage.send
如果为XMLPage.Status 200,则为MsgBox XMLPage.statusText
html.body.innerHTML=XMLPage.responseText
Set links=html.querySelectorAll(“td.date-col>a”)
调试。打印链接。长度
对于i=0的链接,长度为-1
Debug.Print链接(i).href
下一个
设置链接=无
设置html=Nothing
端接头
仅供参考,当我对每个使用在链接上循环时,Excel将可靠地崩溃,因此我将继续使用显示的循环为我工作:
Sub readData()
Dim XMLPage As New MSXML2.XMLHTTP60
Dim html As New MSHTML.HTMLDocument, links, a, i
XMLPage.Open "GET", "https://www.hltv.org/stats/matches", False
XMLPage.send
If XMLPage.Status <> 200 Then MsgBox XMLPage.statusText
html.body.innerHTML = XMLPage.responseText
Set links = html.querySelectorAll("td.date-col > a")
Debug.Print links.Length
For i = 0 To links.Length - 1
Debug.Print links(i).href
Next
Set links = Nothing
Set html = Nothing
End Sub
子读取数据()
Dim XMLPage作为新的MSXML2.XMLHTTP60
将html设置为新的MSHTML.HTMLDocument、链接、a、i
XMLPage.Open“GET”https://www.hltv.org/stats/matches”“错
XMLPage.send
如果为XMLPage.Status 200,则为MsgBox XMLPage.statusText
html.body.innerHTML=XMLPage.responseText
Set links=html.querySelectorAll(“td.date-col>a”)
调试。打印链接。长度
对于i=0的链接,长度为-1
Debug.Print链接(i).href
下一个
设置链接=无
设置html=Nothing
端接头
仅供参考,当我对每个
使用在链接
集合上循环时,Excel将可靠地崩溃,因此我将继续使用显示的循环profile
引用一行,而profile.cells(0)
将引用该行的第一列。所以试试
profile.cells(0).getElementsByTagName("a")(0).getAttribute("href")
另外,profile
应声明为HTMLTableRow
profile
引用一行,而profile。单元格(0)
将引用该行的第一列。所以试试
profile.cells(0).getElementsByTagName("a")(0).getAttribute("href")
另外,profile
应该声明为HTMLTableRow
查看MSHTML.HTMLDocument引用,没有方法getElementsByClassName
您需要在所选tbody中的每一行循环,然后获取该行中的第一个td,然后获取该td中的第一个链接并从中读取href属性。您也可以比较td的class属性,但由于它是行中的第一个元素,因此无需进行比较。查看MSHTML.HTMLDocument引用,没有方法getElementsByClassName
您需要在所选tbody中的每一行循环,然后获取该行中的第一个td,然后获取该td中的第一个链接并从中读取href属性。您也可以比较td的class属性,但由于它是行中的第一个元素,因此无需这样做。您使用的URL不提供有效的XML,但可以通过一些简单的正则表达式替换来恢复。一旦我们有了一些有效的XML,我们就可以将其加载到DOM文档中,并根据需要使用XPath选择节点:
Option Explicit
'Add references to:
' - MSXML v3
' - Microsoft VBScript Regular Expressions 5.5
Sub test()
Const START_MARKER As String = "<table class=""stats-table matches-table"">"
Const END_MARKER As String = "</table>"
With New MSXML2.XMLHTTP
.Open "GET", "https://www.hltv.org/stats/matches", False
.send
If .Status = 200 Then
'The HTML isn't valid XHTML, so we can't just use the http.XMLResponse DOMDocument
'Let's extract the HTML table
Dim tableStart As Long
tableStart = InStr(.responseText, START_MARKER)
Dim tableEnd As Long
tableEnd = InStr(tableStart, .responseText, END_MARKER)
Dim tableHTML As String
tableHTML = Mid$(.responseText, tableStart, tableEnd - tableStart + Len(END_MARKER))
'The HTML table has invalid img tags (let's add a closing tag with some regex)
With New RegExp
.Global = True
.Pattern = "(\<img [\W\w]*?)"">"
Dim tableXML As String
tableXML = .Replace(tableHTML, "$1"" />")
End With
'And load an XML document from the cleaned up HTML fragment
Dim doc As MSXML2.DOMDocument
Set doc = New MSXML2.DOMDocument
doc.LoadXML tableXML
End If
End With
If Not doc Is Nothing Then
'Use XPath to select the nodes we need
Dim nodes As MSXML2.IXMLDOMSelection
Set nodes = doc.SelectNodes("//td[@class='date-col']/a/@href")
'Enumerate the URLs
Dim node As IXMLDOMAttribute
For Each node In nodes
Debug.Print node.nodeTypedValue
Next node
End If
End Sub
您使用的URL不提供有效的XML,但可以通过一些简单的正则表达式替换来恢复。一旦我们有了一些有效的XML,我们就可以将其加载到DOM文档中,并根据需要使用XPath选择节点:
Option Explicit
'Add references to:
' - MSXML v3
' - Microsoft VBScript Regular Expressions 5.5
Sub test()
Const START_MARKER As String = "<table class=""stats-table matches-table"">"
Const END_MARKER As String = "</table>"
With New MSXML2.XMLHTTP
.Open "GET", "https://www.hltv.org/stats/matches", False
.send
If .Status = 200 Then
'The HTML isn't valid XHTML, so we can't just use the http.XMLResponse DOMDocument
'Let's extract the HTML table
Dim tableStart As Long
tableStart = InStr(.responseText, START_MARKER)
Dim tableEnd As Long
tableEnd = InStr(tableStart, .responseText, END_MARKER)
Dim tableHTML As String
tableHTML = Mid$(.responseText, tableStart, tableEnd - tableStart + Len(END_MARKER))
'The HTML table has invalid img tags (let's add a closing tag with some regex)
With New RegExp
.Global = True
.Pattern = "(\<img [\W\w]*?)"">"
Dim tableXML As String
tableXML = .Replace(tableHTML, "$1"" />")
End With
'And load an XML document from the cleaned up HTML fragment
Dim doc As MSXML2.DOMDocument
Set doc = New MSXML2.DOMDocument
doc.LoadXML tableXML
End If
End With
If Not doc Is Nothing Then
'Use XPath to select the nodes we need
Dim nodes As MSXML2.IXMLDOMSelection
Set nodes = doc.SelectNodes("//td[@class='date-col']/a/@href")
'Enumerate the URLs
Dim node As IXMLDOMAttribute
For Each node In nodes
Debug.Print node.nodeTypedValue
Next node
End If
End Sub
通常,在处理XML请求时,您会避免使用HTMLDocument
,而是使用MSXML2.DOMDocument
,它具有更强大的查询功能,但您的HTML必须首先是有效的XHTML。您可以拆分Debug.Print profile.getElementsByCassName(“日期列”)(0).getElementsByTagName(“a”)(0).getAttribute吗(“href”)转换为多行,以查看哪一行是有问题的代码。感谢您的查找,我尝试了此操作,发现在搜索“getElementsByClassName”(“日期列”)(0)时发生了这种情况“。如果我使用问题底部所示的innertext,效果很好。有什么想法吗?profile
声明为什么类型?getElementsByClassName
在本文中来自IHTMLElement6
,而getElementsByTagName
来自IHTMLElement2
谢谢您barrowc-添加了这一点laration使所有内容都能完美运行!通常,在处理XML请求时,您应该避免使用HTMLDocument
,而是使用MSXML2.DOMDocument
,它具有更强大的查询功能,但您的HTML必须首先是有效的XHTML。是否可以拆分Debug.Print profile.getElementsByClassName(“日期列”)(0).getElementsByTagName(“a”)(0)。getAttribute(“href”)分为多行,以查看哪一行是有问题的代码。感谢您的查找,我尝试了此操作,并在搜索“getElementsByClassName”(“日期列”)(0)时发现了这种情况“。如果我使用问题底部所示的innertext,效果很好。有什么想法吗?profile
声明为什么类型?getElementsByClassName
在本文中来自IHTMLElement6
,而getElementsByTagName
来自IHTMLElement2
谢谢您barrowc-添加了这一点laration使一切都运行得非常完美!那一行代码似乎返回了所需的href。那么为什么否决投票?我不确定谁否决了投票,但它对我有效。谢谢。那一行代码似乎返回了所需的href。那么为什么否决投票?我不确定谁否决了投票,但它对我有效。谢谢。我能够使用MS对每个
使用XMLIXMLDOMSelection
;-PI能够使用MSXMLIXMLDOMSelection对每个
使用;-P