La mia app utilizza il pacchetto htmlagility. A partire da ora posso ottenere tutti gli elementi di input su un modulo. Il problema è che sto ricevendo TUTTI gli elementi di input per ID. Sto cercando di restringerlo per darmi solo gli elementi di input di un modulo per ID che contengono etichette di testo interne esatte prima di ogni elemento di input.
Esempio:
<label for="email">Email Address:</label>
<input type="text" class="textbox" name="email" id="email" maxlength="50" value="" dir="ltr" tabindex="1"
Sto cercando di ottenere l'input che ha un'etichetta procedente con il testo interno di "Indirizzo email"
Come direi questo?
Ecco la mia app che cattura TUTTI gli elementi di input per 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
Grazie ragazzi .... Devo dire che ho studiato VB.NET per un po 'e ad oggi questo forum è stato fantastico ... felice di averlo trovato ..
Il concetto base qui è quello di ottenere le etichette il cui attributo for
corrisponde all'id input
associato.
Quindi, prima ciclichiamo le etichette e registriamo il testo dell'etichetta in un dizionario che è codificato dal valore for
, quindi scorriamo gli inputs
e se l'id dell'ingresso si trova nel dizionario, recuperiamo il valore dal dizionario ( che è il testo dell'etichetta) e mostralo.
Si noti che ho anche modificato il modo in cui i dati vengono raccolti per essere più efficienti (quasi ogni volta che si concatenano le stringhe, si dovrebbe usare stringbuilder).
Ecco il codice riscritto:
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()