Atributos de elementos de análisis VB.NET y HtmlAgilityPack

html-agility-pack parsing vb.net

Pregunta

Tengo un archivo HTML como este

<html>
      <head>

    <title>Page Name in a Folder</title>
        <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <meta name="apple-mobile-web-app-capable" content="yes"/>
    <link href="resources/css/jquery-ui-themes.css" type="text/css" rel="stylesheet"/>
    <link href="resources/css/axure_rp_page.css" type="text/css" rel="stylesheet"/>
    <link href="data/styles.css" type="text/css" rel="stylesheet"/>
    <link href="files/page_name_in_a_folder/styles.css" type="text/css" rel="stylesheet"/>

  </head>
  <body>
    <div id="base" class="">

      <!-- Image Shape Name (Image) -->
      <div id="u0" class="ax_image" data-label="Image Shape Name">
        <img id="u0_img" class="img " src="images/page_name_not_in_a_folder/u0.png"/>
        <!-- Unnamed () -->
        <div id="u1" class="text">
          <p><span>&nbsp;</span></p>
        </div>
      </div>

      <!-- Heading 1 Shape Name (Shape) -->
      <div id="u2" class="ax_h1" data-label="Heading 1 Shape Name">
        <img id="u2_img" class="img " src="resources/images/transparent.gif"/>
        <!-- Unnamed () -->
        <div id="u3" class="text">
          <p><span>Heading 1</span></p>
        </div>
      </div>

      <!-- Heading 2 Shape Name (Shape) -->
      <div id="u4" class="ax_h2" data-label="Heading 2 Shape Name">
        <img id="u4_img" class="img " src="resources/images/transparent.gif"/>
        <!-- Unnamed () -->
        <div id="u5" class="text">
          <p><span>Heading 2</span></p>
        </div>
      </div>

      <!-- Label Shape Name (Shape) -->
      <div id="u6" class="ax_paragraph" data-label="Label Shape Name">
        <img id="u6_img" class="img " src="resources/images/transparent.gif"/>
        <!-- Unnamed () -->
        <div id="u7" class="text">
          <p><span>Label</span></p>
        </div>
      </div>



      <!-- Unnamed (HTML Button) -->
      <div id="u26" class="ax_html_button">
        <input id="u26_input" type="submit" value="Submit"/>
      </div>
    </div>
  </body>
</html>

Y necesito extraer todos los DIV con sus clases y atributos, por ejemplo:

  • Nombre de la clase: (ax_html_button) extrae el valor del botón = "Enviar"
  • Nombre de la clase: (ax_paragraph) extrae el valor de la etiqueta de datos = "Nombre de la forma de etiqueta"

etc.

Intentado con el uso de HtmlAgilityPack:

Public Shared Sub parseAgility(fName As String)
        Dim htmlDoc As New HtmlAgilityPack.HtmlDocument()
        htmlDoc.OptionFixNestedTags = True

        htmlDoc.Load(fName)

        Dim classes As New List(Of String)()
        For Each node As HtmlNode In htmlDoc.DocumentNode.SelectNodes("//body//div")

            classes.Add(node.InnerHtml)
       Next
    End Sub

Pero no estoy seguro de cómo manejar todos los atributos. Alguna idea ?

¿Y cómo obtener el valor del elemento de entrada ("Enviar")?

 <div id="u26" class="ax_html_button">
    <input id="u26_input" type="submit" value="Submit"/>
  </div>

si escribo esto obtengo el valor del elemento "u16_input" en lugar de "u26"!?

For Each node As HtmlNode In htmlDoc.DocumentNode.SelectNodes("//body//div")
            Dim className = node.GetAttributeValue("class", "")
            Select Case className
                Case "ax_html_button"
                    Dim node2 As HtmlNode = node.SelectSingleNode("//input")

                    value= node2.GetAttributeValue("value", "")
                Case "ax_paragraph"
                Case "ax_h1"
                Case "ax_h2"
                Case "ax_h3"
                Case "ax_h4"
                Case "ax_h5"
                Case "ax_h6"
                Case "ax_checkbox"
            End Select
        Next

EDITAR: Encontré la solución.

Respuesta aceptada

No está del todo claro lo que estás tratando de conseguir. Pero aquí hay un ejemplo para obtener el nombre de clase del atributo de clase:

For Each node As HtmlNode In htmlDoc.DocumentNode.SelectNodes("//body//div")
    Dim className = node.GetAttributeValue("class", "");
    If Not String.IsNullOrEmpty(className) Then classes.Add(className)
Next

Puede utilizar un enfoque similar para obtener otros atributos de los <div> s.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow