Вложенный QuerySelector в 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] &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']")

Я также разместил образец кода 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?

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
4
0
2 864
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.05.21)

Это было мое первое решение, но поскольку на странице есть две похожие таблицы с разбивкой на страницы (с тем же атрибутом title), мне действительно нужно проверить, существует ли этот элемент внутри этого элемента .BoxBody > p:nth-child(2) > span:nth-child(1) span:nth-child(1) ..

drec4s 12.11.2018 18:00

Ok. Если есть достаточно, чтобы продемонстрировать выбор, который необходимо сделать.

QHarr 12.11.2018 18:05

Нет, мне нужно только одно совпадение (независимо от того, есть ли у кнопки "следующий" href или нет)

drec4s 12.11.2018 18:14

Пожалуйста, проверьте отредактированный html. Я только хочу проверить, есть ли у первого a с названием Next pagehref или нет ... И я не могу использовать querySelectorAll, так как он постоянно вылетает из Excel ...

drec4s 12.11.2018 18:16

Первый тег a с названием Next page

drec4s 12.11.2018 18:17

Подумал о чем-то вроде html.querySelector(".BoxBody").getElementsByTagName("p")(2).‌​getElementsByTagName‌​("span")(1).querySel‌​ector("a[title='Next page']"), но это тоже, похоже, не работает ...

drec4s 12.11.2018 18:19

Пожалуйста, потерпите меня. Вышесказанное ближе к тому, о чем вы спрашиваете? Только что обновлено

QHarr 12.11.2018 18:21

Другие вопросы по теме