【问题标题】:Excel VBA HTML Nested QuerySelectorExcel VBA HTML 嵌套查询选择器
【发布时间】:2019-04-15 10:17:36
【问题描述】:

考虑这个 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>

我正在尝试获取具有“下一页”href(如果有的话)的anchor 标签。

我在使用 Firefox 的控制台中尝试了这个,它可以工作:

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

我也使用querySelector 提供了一个示例VBA 代码,但使用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 提取该元素?

【问题讨论】:

    标签: html excel vba web-scraping css-selectors


    【解决方案1】:

    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(21 年 12 月 5 日修改日期)

    【讨论】:

    • 这是我的第一个解决方案,但由于页面中有两个相似的分页表(具有相同的标题属性),我真的需要检查该元素是否存在于该 .BoxBody &gt; p:nth-child(2) &gt; span:nth-child(1) span:nth-child(1) 元素中。
    • 好的。如果有足够的证据表明必须做出的选择。
    • 不,我只想要一个匹配项(“下一步”按钮是否有 href)
    • 请查看已编辑的html。我只想检查标题为Next page 的第一个a 是否有href...而且我不能使用querySelectorAll,因为它经常使Excel 崩溃...
    • 第一个a标签,标题为Next page
    猜你喜欢
    • 2018-05-08
    • 2013-01-19
    • 1970-01-01
    • 2022-11-03
    • 2011-09-16
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    相关资源
    最近更新 更多