Рассмотрим этот фрагмент 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.05.21)
Ok. Если есть достаточно, чтобы продемонстрировать выбор, который необходимо сделать.
Нет, мне нужно только одно совпадение (независимо от того, есть ли у кнопки "следующий" href или нет)
Пожалуйста, проверьте отредактированный html. Я только хочу проверить, есть ли у первого a с названием Next pagehref или нет ... И я не могу использовать querySelectorAll, так как он постоянно вылетает из Excel ...
Первый тег a с названием Next page
Подумал о чем-то вроде html.querySelector(".BoxBody").getElementsByTagName("p")(2).getElementsByTagName("span")(1).querySelector("a[title='Next page']"), но это тоже, похоже, не работает ...
Пожалуйста, потерпите меня. Вышесказанное ближе к тому, о чем вы спрашиваете? Только что обновлено
Это было мое первое решение, но поскольку на странице есть две похожие таблицы с разбивкой на страницы (с тем же атрибутом title), мне действительно нужно проверить, существует ли этот элемент внутри этого элемента
.BoxBody > p:nth-child(2) > span:nth-child(1) span:nth-child(1)..