html - Excel VBA HTML 嵌套查询选择器
问题描述
考虑这个 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] 1 , <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] 1 , <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']")
我也使用了一个示例 VBA 代码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 提取该元素?
解决方案
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 日修改日期)
推荐阅读
- java - Java Hibernate 创建本机查询 javax.persistence.TransactionRequiredException:执行更新/删除查询
- jquery - 检查文件是否存在,如果不存在则显示特定的 div
- typescript - WebDriverError:断开连接:收到 Inspector.detached 事件
- python - Wagtail:如何将模型实例传递给小部件并在模板中访问它
- excel - 根据日期行引用计数值为 1 的行
- excel - 如何在 SharePoint 中链接两个 Excel 文件?
- python - 如果函数调用最小化,curve_fit 不可能
- node.js - 位置 0 视频长度的 JSON 中的意外令牌 G
- javascript - 模态显示在提交后在jquery中模态(隐藏)后不起作用
- mollie - 调用 Mollie webhook URL 但未获取付款 ID