Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 将IE自动化代码更改为XML时出错_Vba_Excel_Internet Explorer_Xml Parsing - Fatal编程技术网

Vba 将IE自动化代码更改为XML时出错

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

我最近开始使用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" 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对每个
使用
XML
IXMLDOMSelection
;-PI能够使用MSXML
IXMLDOMSelection对每个
使用
;-P