【问题标题】:Can't extract links out of xml content无法从 xml 内容中提取链接
【发布时间】:2018-12-25 03:27:16
【问题描述】:

我在 vba 中编写了一个脚本,以从站点地图链接中获取不同节点内的所有链接,但无法成功。

如何获取这些链接?

这是我已经尝试过的:

Sub TestXML()
    Dim Http As New XMLHTTP60, Xmldoc As Object
    Dim post As Object, R&

    With Http
        .Open "GET", "https://www.klerenmakendebaby.nl/product-sitemap.xml", False
        .setRequestHeader "User-Agent", "Mozilla/5.0"
        .send
        Set Xmldoc = CreateObject("MSXML2.DOMDocument")
        Xmldoc.LoadXML .responseXML.xml
    End With

    For Each post In Xmldoc.SelectNodes("//url")
        R = R + 1: Cells(R, 1) = post.SelectNodes(".//loc")(0).Text
    Next post
End Sub

在执行时它什么也不获取,也不抛出任何错误。

【问题讨论】:

    标签: xml vba excel web-scraping


    【解决方案1】:

    实现相同的另一种方法是:

    Sub TestXML()
        Dim Http As New XMLHTTP60
        Dim Xdoc As New DOMDocument, post As Object, R&
    
        With Http
            .Open "GET", "https://www.klerenmakendebaby.nl/product-sitemap.xml", False
            .setRequestHeader "User-Agent", "Mozilla/5.0"
            .send
            Xdoc.LoadXML .responseText
        End With
    
        For Each post In Xdoc.getElementsByTagName("url")
            R = R + 1: Cells(R, 1) = post.getElementsByTagName("loc")(0).Text
        Next post
    End Sub
    

    【讨论】:

    • 如果您看到意外编辑,我深表歉意。该死的答案排序意味着我编辑了你的问题而不是我的问题。对不起。
    【解决方案2】:

    按照以下?为您的版本添加对 Microsoft XML 库的引用。我在 Excel 2016 上,所以使用 xml 6.0。和文件60。

    Option Explicit
    Public Sub TestXML()
        Dim Http As New XMLHTTP60, Xmldoc As New MSXML2.DOMDocument60, R&, aNodeList As Object, bNode As IXMLDOMNode
        Application.ScreenUpdating = False
        With Http
            .Open "GET", "https://www.klerenmakendebaby.nl/product-sitemap.xml", False
            .setRequestHeader "User-Agent", "Mozilla/5.0" 
            .send
            Xmldoc.LoadXML .responseText
        End With
        Set aNodeList = Xmldoc.DocumentElement.SelectNodes("//loc")
        For Each bNode In aNodeList.Context.ChildNodes
            R = R + 1: Cells(R, 1) = bNode.FirstChild.Text
        Next bNode
        Application.ScreenUpdating = True
    End Sub
    

    【讨论】:

    • 这并不重要或破坏代码,但您的两个Application.ScreenUpdating 分配都是True。可能只是一个糟糕的粘贴。
    • 哎呀...抱歉确实是粘贴。
    猜你喜欢
    • 2019-03-06
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    相关资源
    最近更新 更多