【问题标题】:innerText returning is including the tagsinnerText 返回包含标签
【发布时间】:2018-03-30 23:39:36
【问题描述】:

我对 VBA 和 Webscraping 非常陌生。我正在尝试打开 XML 文档中的 URL。

http://research.investors.com/services/AutoSuggest.asmx/GetQuoteResults?q=txn&limit=10

InnerText 给了我 URL,但包括 <Url></Url>

<Url>http://research.investors.com/stock-quotes/nasdaq-apple-inc-aapl.htm</Url>

这就是为什么我无法打开 URL。 这是我的代码:

    Sub Macro1()

Dim ie As Object


Set Rng = Range("A3:A6")

Set Row = Range(Rng.Offset(1, 0), Rng.Offset(1, 0).End(xlDown))

        Set ie = CreateObject("InternetExplorer.Application")
        With ie
        .Visible = True
        For Each Row In Rng
        .navigate "research.investors.com/services/AutoSuggest.asmx/GetQuoteResults?q=" & Range("A" & Row.Row).Value & "&limit=10"
        Application.Wait (Now + TimeValue("0:00:02"))
        Do
        DoEvents
        Loop Until ie.readyState = READYSTATE_COMPLETE
        Dim doc As HTMLDocument
        Set doc = ie.document
        While ie.readyState <> 4

        Wend


       .navigate doc.getElementsByTagName("Url")(0).innerText




        Next Row
    End With
    ie.Quit
End Sub

我希望有人能指出我做错了什么。

非常感谢,再见 夜航

【问题讨论】:

  • 如果它是一个 XML 文档,您应该将其真正解析为 XML,而不是 HTML。 "Url" 不是一个有效的 HTML 标签(虽然它似乎是通过 getelementsbytagname 找到的),所以也许 IE 不知道如何渲染 innerhtml...
  • 注意:您的代码有一些不一致之处。你有一个with ie 块,但你在块内引用ie 3 次。只需放弃使用with 块并使用ie.visible ..ie.navigate ..

标签: vba url tags innertext


【解决方案1】:

通常您可以通过 3 种方式访问​​节点:

  1. 通过使用 getElementsByTagName() 方法

  2. 通过循环(遍历)节点树。

  3. 通过导航节点树,使用节点关系。

我无法实现第一种方法,但以下是后两种方法的 4 个示例和第 5 个解析字符串并使用拆分函数提取所需字符串的方法。

Option Explicit

Public Sub test()
    Dim http As Object, xml As String            'Dim http As New XMLHTTP60
    Set http = CreateObject("MSXML2.ServerXMLHTTP")

    With http
        .Open "GET", "https://research.investors.com/services/AutoSuggest.asmx/GetQuoteResults?q=txn&limit=10", False
        .send
        xml = .responseText
    End With

    Dim doc As MSXML2.DOMDocument60

    Set doc = New MSXML2.DOMDocument60

    If Not doc.LoadXML(xml) Then
        Err.Raise doc.parseError.ErrorCode, , doc.parseError.reason
        Exit Sub
    End If

    Debug.Print "Method 1 " & doc.ChildNodes(1).ChildNodes(0).LastChild.Text
    Debug.Print "Method 2 " & doc.ChildNodes(1).ChildNodes(0).ChildNodes(2).Text '<== IXMLDOMElement

    Dim node As IXMLDOMElement, node2 As IXMLDOMElement

    For Each node In doc.DocumentElement.ChildNodes
        For Each node2 In node.ChildNodes
            If node2.nodeName = "Url" Then
                Debug.Print "Method 3 " & node2.Text
                Exit For
            End If
        Next node2
    Next node

    Dim m As IXMLDOMNodeList, i As Long
    Set m = doc.DocumentElement.ChildNodes

    For i = 0 To doc.DocumentElement.ChildNodes.Length - 1

        Dim x As IXMLDOMElement
        Set x = doc.DocumentElement.ChildNodes(i)
        Dim xlen As Long, y As IXMLDOMElement, n As Long
        xlen = x.ChildNodes.Length
        Set y = x.FirstChild

        For n = 0 To xlen - 1
            If y.nodeName = "Url" Then
                Debug.Print "Method 4 " & y.Text
            End If
            Set y = y.NextSibling
        Next n

    Next i

    Debug.Print "Method 5 " & Split(Split(xml, "<Url>")(1), "</Url")(0)

End Sub

【讨论】:

  • 对此有何反馈?
猜你喜欢
  • 1970-01-01
  • 2011-05-09
  • 2014-09-02
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多