Как получить внутренний текст метки перед элементом ввода?

html-agility-pack vb.net

Вопрос

Мое приложение использует пакет htmlagility. На данный момент я могу получить все элементы ввода в форме. Проблема в том, что я получаю ВСЕ элементы ввода по ID. Я пытаюсь сузить его, чтобы дать мне только входные элементы формы по идентификатору, которые содержат точные внутренние текстовые метки перед каждым элементом ввода.

Пример:

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

Я пытаюсь получить вход, который имеет обработчик с внутренним текстом «Адрес электронной почты»,

Как я могу это сказать?

Вот мое приложение, которое захватывает ВСЕ элементы ввода по 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

Спасибо, ребята .... Я должен сказать, что изучал VB.NET на некоторое время, и на сегодняшний день этот форум был потрясающим ... рад, что я его нашел ..

Принятый ответ

Основная концепция здесь , чтобы получить ярлыки которых for атрибута соответствует идентификатору соответствующего input .

Итак, сначала мы прокручиваем метки и записываем текст метки в словаре, на который вводится значение for , затем мы перебираем inputs и, если идентификатор ввода находится в словаре, мы извлекаем значение из словаря ( который является текстом метки) и показать его.

Обратите внимание, что я также изменил способ сбора данных, чтобы быть более эффективными (почти в любой момент, когда вы объединяете строки, вы должны использовать stringbuilder).

Вот переписанный код:

    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()



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему