¿Cómo escribir correctamente un selector de atributo CSS para extraer todos los atributos de id?

Situación:

Actualmente estoy intentando reproducir, en VBA, el selector de atributos con la syntax [attr] de los ejercicios de selectores de CSS que se dan aquí .

El selector está destinado a seleccionar elementos en función del valor del atributo dado.

Resultado Esperado:

En la muestra html que html.querySelectorAll("[id]") , el resultado esperado de intentar obtener TODOS los atributos de id , usando html.querySelectorAll("[id]") , se resalta en amarillo cuando lo ejecuta.

Problema:

En lugar de obtener solo la información asociada con los elementos de id , los bits resaltados en amarillo, recibo mucho más texto. Parece casi todo con material repetido.

Lo que he intentado:

  1. He leído muchos recursos de CSS sobre esto. Todos ellos dicen la misma syntax. * Ver referencias de muestra . No he encontrado un ejemplo de VBA muy bien adaptado, así que es posible que no esté convirtiendo la syntax correctamente.
  2. En línea con lo anterior, solo como una prueba , traté de alterar la syntax del selector para apuntar a una id específica. Eso funcionó perfectamente.

Por ejemplo:

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

Esto, en mi ejemplo de código, arroja el valor esperado de:

 

I live in Duckburg

  1. Intenté eliminar el [] de [id] que no imprimió nada en la ventana inmediata.
  2. Esta pregunta SO tiene una respuesta que menciona que Chrome, el navegador que estoy usando, es problemático con algunos selectores de CSS, pero no creo que esto se aplique a mi escenario.

Pregunta:

¿Cómo escribo correctamente un selector CSS, en VBA, para extraer todos los elementos con el atributo id de la página web dada?

Código:

 Option Explicit '[attribute] [target] Selects all elements with a target attribute eg [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 

Resultado esperado de HMTL en amarillo:

 

<h1>Welcome to My Homepage</h1>

<div class="intro">

<p>My name is Donald <span id="Lastname">Duck.</span></p>

<p id="my-Address">I live in Duckburg</p>

<p>I have many friends:</p>

</div>

<ul id="Listfriends>
  • <li>Goofy</li>
  • <li>Mickey</li>
  • <li>Daisy</li>
  • <li>Pluto</li>
</ul>

    <p>All my friends are great!<br>
    But I really like Daisy!!</p>

    <p lang="it" title="Hello beautiful">Ciao bella</p>

    <h3>We are all animals!</h3>

    <p><b>My latest discoveries have led me to believe that we are all animals:</b></p>

    <table>

      Referencias

      1. Mozilla: selectores de CSS
      2. Referencia de selector CSS w3schools
      3. VBA / DOM – Obtiene elementos basados ​​en el atributo
      4. No se puede obtener el selector de atributo CSS para que funcione
      5. Selector de atributos de Chrome y CSS

      Referencias del proyecto:

      * a través de VBE> Herramientas> Referencias

      Referencias del proyecto

      Resulta que dos errores necesitan ser corregidos.

      1. Al HTML fuente del sitio web le faltaba el cierre " en la sección

          . Esto significaba que el selector CSS llevaba a cabo el emparejamiento.

        • Traje todo el HTML de la página y lo consulté cuando, de hecho, solo quería el HTML dentro de un iframe específico para poder trabajar solo con los ID esperados.

        Código:

         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