Как правильно написать селектор атрибутов CSS для извлечения всех атрибутов id? - PullRequest
0 голосов
/ 27 апреля 2018

Положение:

В настоящее время я пытаюсь воспроизвести в VBA селектор атрибутов с синтаксисом [attr] из упражнений селекторов CSS, приведенных здесь .

Селектор предназначен для выбора элементов на основе значения данного атрибута.

Ожидаемый результат:

В приведенном мною примере html ожидаемый результат попытки получить атрибуты ALL id с использованием html.querySelectorAll("[id]") выделяется желтым цветом при его запуске.

Проблема:

Вместо того, чтобы получать только информацию, связанную с id элементами - желтыми выделенными битами - я получаю гораздо больше текста. Похоже, почти все с некоторым повторным материалом.

Что я пробовал:

  1. Я прочитал множество CSS-ресурсов по этому вопросу. Все они имеют одинаковый синтаксис. * См. Примеры ссылок . Я не нашел хорошо подобранного примера VBA, поэтому, возможно, я неправильно конвертирую синтаксис.
  2. В соответствии с вышеизложенным, только в качестве теста , я попытался изменить синтаксис селектора, чтобы указать конкретный id. Это сработало отлично.

Например:

 Set a = html.querySelectorAll("[id=""my-Address""]")

Это, в моем примере кода, дает ожидаемое значение:

<p id="my-Address">I live in Duckburg</p>
  1. Я попытался удалить [] из [id], который ничего не выводил в непосредственное окно.
  2. Этот ТАК вопрос содержит ответ, в котором упоминается Chrome, используемый мной браузер, как проблемный для некоторых селекторов CSS, но я не думаю, что это применимо к моему сценарию.

Вопрос:

Как правильно написать селектор CSS в VBA, чтобы извлечь все элементы с атрибутом id из заданной веб-страницы ?

Код:

Option Explicit

'[attribute] [target]  Selects all elements with a target attribute e.g. [id]

Public Sub Test13()
    Dim html As MSHTML.HTMLDocument, i As Long
    Set html = GetTestHTML()
    Dim a As Object
    'Set a = html.querySelectorAll("[id=""my-Address""]")
    Set a = html.querySelectorAll("[id]")

    For i = 0 To a.Length - 1
        Debug.Print a(i).innerText
    Next i
End Sub

Public Function GetTestHTML(Optional ByVal url As String = "https://www.w3schools.com/cssref/trysel.asp") As HTMLDocument
    Dim http As New XMLHTTP60
    Dim html As New HTMLDocument
    With http                                    'Set http = CreateObject("MSXML2.XMLHttp60")
        .Open "GET", url, False
        .send
        html.body.innerHTML = .responseText
        Set GetTestHTML = html
    End With
End Function

HMTL ожидаемый результат в желтом:

<div class="noSel">
<h1><span class="markup">&lt;h1&gt;</span>Welcome to My Homepage<span class="markup">&lt;/h1&gt;</span></h1>

<div id="helpIntro">
<span class="markup">&lt;div class="intro"&gt;</span>
<div class="intro">
<p style="margin-top:4px;"><span class="markup">&lt;p&gt;</span>My name is Donald <span id="Lastname" style="border-color: rgb(255, 102, 102); background-color: rgb(255, 255, 153);"><span class="markup">&lt;span id="Lastname"&gt;</span>Duck.<span class="markup">&lt;/span&gt;</span></span><span class="markup">&lt;/p&gt;</span></p>
<p id="my-Address" style="border-color: rgb(255, 102, 102); background-color: rgb(255, 255, 153);"><span class="markup">&lt;p id="my-Address"&gt;</span>I live in Duckburg<span class="markup">&lt;/p&gt;</span></p>
<p style="margin-bottom:4px;"><span class="markup">&lt;p&gt;</span>I have many friends:<span class="markup">&lt;/p&gt;</span></p>
</div>
<span class="markup">&lt;/div&gt;</span>
</div>

<br>
<div class="helpUl" style="border-color: rgb(255, 102, 102); background-color: rgb(255, 255, 153);">
<span class="markup">&lt;ul id="Listfriends&gt;</span>
<ul id="Listfriends" style="margin-top:0px;margin-bottom:0px;">

<li><span class="markup">&lt;li&gt;</span>Goofy<span class="markup">&lt;/li&gt;</span></li>
<li><span class="markup">&lt;li&gt;</span>Mickey<span class="markup">&lt;/li&gt;</span></li>
<li><span class="markup">&lt;li&gt;</span>Daisy<span class="markup">&lt;/li&gt;</span></li>
<li><span class="markup">&lt;li&gt;</span>Pluto<span class="markup">&lt;/li&gt;</span></li>
</ul>       
<span class="markup">&lt;/ul&gt;</span>
</div>

<ul style="display:none;"></ul>
<p><span class="markup">&lt;p&gt;</span>All my friends are great!<span class="markup">&lt;br&gt;</span><br>But I really like Daisy!!<span class="markup">&lt;/p&gt;</span></p>

<p lang="it" title="Hello beautiful"><span class="markup">&lt;p lang="it" title="Hello beautiful"&gt;</span>Ciao bella<span class="markup">&lt;/p&gt;</span></p>


<h3><span class="markup">&lt;h3&gt;</span>We are all animals!<span class="markup">&lt;/h3&gt;</span></h3>

<p><span class="markup">&lt;p&gt;</span><span><b><span class="markup">&lt;b&gt;</span>My latest discoveries have led me to believe that we are all animals:<span class="markup">&lt;/b&gt;</span></b></span><span class="markup">&lt;/p&gt;</span></p>

<div class="helpTable" style="width:220px;">
<span class="markup">&lt;table&gt;</span>
<ul style="display:none;"></ul>
  <div class="noSel" style="margin-top:10px;">

Ссылка:

  1. Mozilla: Селекторы CSS
  2. w3schools Справочник по выбору CSS
  3. VBA / DOM - Получить элементы на основе атрибута
  4. Невозможно заставить работать селектор атрибутов CSS
  5. Селектор атрибутов Chrome и CSS

Ссылки на проекты:

* через VBE> Инструменты> Ссылки

Project references

1 Ответ

0 голосов
/ 06 июля 2018

Оказывается, две ошибки необходимо исправить.

  1. В исходном веб-сайте HTML отсутствовал закрывающий " в разделе <ul id="Listfriends>. Это должно было быть <ul id="Listfriends">. Это означало, что селектор CSS продолжал сопоставление.
  2. Я принес весь HTML-код со страницы и спросил, что на самом деле мне нужен только HTML-код в определенном iframe, чтобы работать только с ожидаемыми идентификаторами.

Код:

Option Explicit
Public Sub GetInfo()
    Dim html As MSHTML.HTMLDocument, i As Long
    Set html = GetTestHTML()
    Dim a As Object
    html.body.innerHTML = html.querySelector("#iframeResult").document.getElementById("selectorResult").innerHTML
    Set a = html.querySelectorAll("[id]")

    For i = 0 To a.Length - 1
        Debug.Print a(i).innerText
    Next i
End Sub

Public Function GetTestHTML(Optional ByVal url As String = "https://www.w3schools.com/cssref/trysel.asp") As HTMLDocument
    Dim http As New XMLHTTP60
    Dim html As New HTMLDocument
    With http                                    'Set http = CreateObject("MSXML2.XMLHttp60")
        .Open "GET", url, False
        .send
        html.body.innerHTML = Replace(.responseText, """Listfriends", """Listfriends""")
        Set GetTestHTML = html
    End With
End Function
...