¿Cómo obtengo el texto interno de una etiqueta antes de un elemento de entrada?

html-agility-pack vb.net

Pregunta

Mi aplicación está utilizando htmlagility pack. A partir de ahora puedo obtener todos los elementos de entrada en un formulario. El problema es que estoy obteniendo TODOS los elementos de entrada por ID. Estoy tratando de limitarlo para que solo me proporcione elementos de entrada de un formulario por ID que contengan etiquetas de texto internas exactas antes de cada elemento de entrada.

Ejemplo:

<label for="email">Email Address:</label>
<input type="text" class="textbox" name="email" id="email" maxlength="50" value="" dir="ltr" tabindex="1" 

Estoy tratando de obtener la entrada que tiene una etiqueta de procedimiento con el texto interno de "Dirección de correo electrónico"

¿Cómo puedo escribir esto?

Aquí está mi aplicación que captura TODOS los elementos de entrada por ID.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    Dim doc As HtmlDocument
    Dim web As New HtmlWeb
    doc = web.Load("http://shaggybevo.com/board/register.php")
    Dim docNode As HtmlNode = doc.DocumentNode
    Dim nodes As HtmlNodeCollection = docNode.SelectNodes("//input")
    'SelectNodes takes a XPath expression
    For Each node As HtmlNode In nodes
        'Get all input elements by id
        Dim id As String = node.GetAttributeValue("value", "id")

        'print all input elements by id to form2 richtextbox
        Form2.RichTextBox1.Text = Form2.RichTextBox1.Text & Environment.NewLine & id.ToString & name.ToString()
        Form2.Show()

    Next

End Sub

Gracias chicos ... Tengo que decir que he estado estudiando VB.NET por un tiempo y hasta la fecha este foro ha sido increíble ... me alegro de haberlo encontrado ...

Respuesta aceptada

El concepto básico aquí es obtener las etiquetas cuyo atributo for coincide con el id de la input asociada.

Por lo tanto, primero recorremos las etiquetas y grabamos el texto de la etiqueta en un diccionario que está codificado por el valor for , luego hacemos un ciclo a través de las inputs y si la identificación de la entrada está en el diccionario, recuperamos el valor del diccionario ( cual es el texto de la etiqueta) y mostrarlo.

Tenga en cuenta que también he modificado la forma en que se recopilan los datos para que sean más eficientes (casi cada vez que concatene cadenas, debe usar el constructor de cadenas).

Aquí está el código reescrito:

    Dim web As HtmlAgilityPack.HtmlWeb = New HtmlWeb()
    Dim doc As HtmlAgilityPack.HtmlDocument = web.Load("http://shaggybevo.com/board/register.php")
    Dim nodes As HtmlNodeCollection

    ' Keeps track of the labels by the associated control id
    Dim labelText As New System.Collections.Generic.Dictionary(Of String, String)

    ' First, get the labels
    nodes = doc.DocumentNode.SelectNodes("//label")

    If nodes IsNot Nothing Then
        For Each node In nodes
            If node.Attributes.Contains("for") Then
                Dim sFor As String

                ' Extract the for value
                sFor = node.Attributes("for").Value

                ' If it does not exist in our dictionary, add it
                If Not labelText.ContainsKey(sFor) Then
                    labelText.Add(sFor, node.InnerText)
                End If
            End If
        Next
    End If

    nodes = doc.DocumentNode.SelectNodes("//input")

    Dim sbText As New System.Text.StringBuilder(500)

    If nodes IsNot Nothing Then
        For Each node In nodes
            ' See if this input is associated with a label
            If labelText.ContainsKey(node.Id) Then
                ' If it is, add it to our collected information
                sbText.Append("Label = ").Append(labelText(node.Id))
                sbText.Append(", Id = ").Append(node.Id)

                sbText.AppendLine()
            End If
        Next
    End If

    Form2.RichTextBox1.Text = sbText.ToString
    Form2.Show()


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué