代码之家  ›  专栏  ›  技术社区  ›  drec4s

Excel VBA HTML嵌套查询选择器

  •  2
  • drec4s  · 技术社区  · 7 年前

    考虑HTML页面的这个摘录:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <body>
    <div class="BoxBody">
    <span class="txt">20 Records found. </span>
    <p style="text-align: right;"><span class="txt">[First/Previous] &nbsp;1&nbsp;, <a class="page" href="javascript:paginacao('paginar','2');" title="Go to page 2">2</a> [<a class="page" title="Next page" href="javascript:paginacao('paginar','next');">Next</a>/<a class="page" title="Last page" href="javascript:paginacao('paginar','last');">Last</a>]</span></p>
    <br>
    <span class="txt">25 Records found. </span>
    <p style="text-align: right;"><span class="txt">[First/Previous] &nbsp;1&nbsp;, <a class="page" href="javascript:paginacao('paginar2','2');" title="Go to page 2">2</a> [<a class="page" title="Next page" href="javascript:paginacao('paginar2','next');">Next</a>/<a class="page" title="Last page" href="javascript:paginacao('paginar2','last');">Last</a>]</span></p>
    </div>
    </body>
    </html>
    

    我在试着得到 anchor 具有“下一页”的标记 href (如果有)。

    我使用Firefox在控制台中尝试了这个方法,效果很好:

    document.querySelector(".BoxBody > p:nth-child(2) > span:nth-child(1)").querySelector("a[title='Next page']")
    

    querySelector 同样,但它失败了 Invalid argument .

    Sub test()
    
    Dim oFSO As Object, paginator As Object
    Dim oFS As Object, sText As String
    
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oFS = oFSO.OpenTextFile(ThisWorkbook.Path & "\example.html")
    
    Do Until oFS.AtEndOfStream
        sText = oFS.ReadAll()
    Loop
    
    
    Dim html As HTMLDocument, html2 As Object
    Set html = New HTMLDocument
    Set html2 = html
    html2.Write sText
    
    Set paginator = html.querySelector(".BoxBody > p:nth-child(2) > span:nth-child(1)").querySelector("a[title='Next page']")
    
    End Sub
    

    是什么原因造成的?这个 p:nth-child(2) 标识符? 如何使用VBA提取该元素?

    1 回复  |  直到 7 年前
        1
  •  4
  •   QHarr    5 年前

    nth-child(2) VBA中不支持,并且确实导致错误消息。你不能使用 :nth-child() :nth-of-type() . 在可用于处理伪类的库中实现的很少。你可以用 first-child 有趣的是。您还将发现,可以链接querySelector的对象有限。

    Dim ele As Object, iText As String
    Set ele = html.querySelector(".BoxBody > p > span:first-child > a[title='Next page']")
       
    On Error Resume Next
    iText = ele.href
    On Error GoTo 0
    
    If iText = vbNullString Then '<== This assumes that the href has a value otherwise use an On Error GoTo which will then handle the error and print "no href"
        Debug.Print "No href"
    Else
       Debug.Print "href"
    End If
    

    编辑:29/5/21从上个月的某个时候开始(?)可以广泛使用element.querySelector以及大多数标准的伪类选择器(至少对于Windows 10,MSHTML.DLL 11.00.19041.985(日期修改于12/5/21)

    推荐文章