Comment parser le contenu d'un div avec id ?

Signaler
-
 johnspart -
Bonjour à tous.
Mon but est de récuperer le texte "Registered And Active Website" dans le code html suivant puis de l'afficher dans NsTextBox19




Domain Status:


Registered And Active Website




J'utilise ce code pour me connecter au site:
    Private Sub TrackWebsite_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackWebsite.Click

        If WebsiteIp.Text.Length > 0 Then
            Dim url As String = ("http://whois.domaintools.com/" + WebsiteIp.Text)
            WebBrowser1.Navigate(url)
            While Not WebBrowser1.ReadyState = WebBrowserReadyState.Complete

                Application.DoEvents()

                InfoCollector2.Start()
                WebsiteTracking.Text = WebsiteIp.Text

            End While
        Else
            MsgBox("Please, insert an domain website")
        End If

    End Sub


Puis pour recuperer le texte qui m'interesse:

    Private Sub InfoCollector2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles InfoCollector2.Tick

        Dim Focus As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("div")
        For Each curElement As HtmlElement In Focus
            Dim controlName As String = curElement.GetAttribute("ssTab-domainStatus").ToString
            If controlName = "form-field wide-80" Then
                Dim str2 As String = "x"
                str2 = curElement.GetAttribute("Value")
                NsTextBox19.Text = str2
            End If
        Next
        InfoCollector2.Stop()

    End Sub


Ce code n'affiche rien dans NsTextBox19, je devrais peut-être utiliser la methode WebBrowser1.Document.GetElementsById (vu que le div a une id) mais je ne sais pas comment le rediger.
Pouvez vous m'aider ?
Merci.

16 réponses

Messages postés
550
Date d'inscription
jeudi 12 octobre 2006
Statut
Membre
Dernière intervention
6 juin 2015
4
Chalut,

j'ai mis ton HTML dans un textbox pour le test.
Et j'ai mis ceci dans un bouton:

        Dim HTML As String = TextBox1.Text
        Dim pattern As String = "class=""form-field wide-80"">(.*?)
"
        Dim r As New Regex(pattern, RegexOptions.Singleline)
        Dim m As Match = r.Match(HTML, HTML.IndexOf("ssTab-domainStatus"))

        Debug.WriteLine("1 " & m.Groups(1).Value)
Salut merci de t'interresser à mon probleme
Dans le cas présent tu utilise le regex, mais je ne suis pas familier avec cette methode.
Comment ecrirai tu le code pour que "Registered And Active Website" s'affiche dans NsTextBox19 ?
Messages postés
550
Date d'inscription
jeudi 12 octobre 2006
Statut
Membre
Dernière intervention
6 juin 2015
4
Ton code sur la bonne voie, regarde cette exemple:
http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/14c0e3b7-9385-4f32-86ec-47dd36650a89/


SINON hihihi ... à l'ancienne !
Tu peux faire dans la perfection en maîtrisant tous les paramètres.
Un exemple vite fait ^^ ... Pour te donner des idées ;)

    Structure SeekInfo
        Dim PosDebut As Integer
        Dim PosFin As String
        Dim nbOccurence As Integer
        Dim Pattern As String
    End Structure

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim HTML As String = TextBox1.Text

        '

        '


        '
Domain Status:

        '
Registered And Active Website

        '


        Dim findDomain As String = "
"
        Dim posField As New SeekInfo
        posField = GetPosHtml(HTML, findField, posDomain.PosFin)
        If IsNothing(posDomain) Then Exit Sub
        If posField.PosDebut < 0 Then
            MessageBox.Show("La balise FIELD est introuvable !")
            Exit Sub
        End If

        Dim endField As String = "<"
        Dim posEndField As New SeekInfo
        posEndField = GetPosHtml(HTML, endField, posField.PosFin)
        If IsNothing(posEndField) Then Exit Sub
        If posEndField.PosDebut < 0 Then
            MessageBox.Show("La balise END_FIELD est introuvable !")
            Exit Sub
        End If

        MessageBox.Show(HTML.Substring(posField.PosFin, posEndField.PosDebut - posField.PosFin), "SURPRISE ^^")
    End Sub

    Private Function GetPosHtml(ByVal SourceHtml As String, ByVal sPattern As String, Optional ByVal StartPos As Integer 0, Optional ByVal OccurenceCatcher As Integer 1) As SeekInfo
        If SourceHtml = "" Then
            Throw New Exception("GetPosHtml() error:" + ControlChars.NewLine & "Aucune source Html disponible pour effectuer une recherche !")
            Return Nothing
        End If
        If sPattern = "" Then
            Throw New Exception("GetPosHtml() error:" + ControlChars.NewLine & "Aucun critère de recherche n'a été définit !")
            Return Nothing
        End If

        Dim _seek As Integer = 0
        Dim _wInfo As New SeekInfo

        'trimage ^^
        sPattern = sPattern.Trim
        _wInfo.Pattern = sPattern

        While Not _seek = -1
            _seek = SourceHtml.IndexOf(sPattern, StartPos)
            If _seek = -1 Then Exit While
            If _seek >= 0 Then _wInfo.nbOccurence += 1
            _wInfo.PosDebut = _seek
            _wInfo.PosFin = _seek + sPattern.Length
            If _wInfo.nbOccurence = OccurenceCatcher Then Exit While

            If (_wInfo.PosFin < SourceHtml.Length) Then
                _seek += sPattern.Length
            End If
        End While

        Return _wInfo
    End Function
Merci de ton aide mais quand j'utilise ton code j'ai le message d'erreur:
"Aucune source Html disponible pour effectuer une recherche !"

Je suis encore débutant en vb alors je galère un peu.
Je suis sur que j'approche tu but avec mon code:
        Dim Focus As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("div")
        For Each curElement As HtmlElement In Focus
            Dim controlName As String = curElement.GetAttribute("id").ToString
            If controlName = "ssTab-domainStatus" Then
                Dim str2 As String = "x"
                str2 = curElement.GetAttribute("form-field wide-80")
                NsTextBox19.Text = str2
            End If
        Next


J'ai regardé les exemples que tu donne mais je n'arrive à rien de concluant.
J'ai vraiment besoin d'avancer si tu pouvais me donner un petit coup de pouce vu tes competence, ce me permetrait de continuer.

Bonjour,

Pourquoi ne pas faire un Split?

        
'Le TextBox1 contient:
        '

        '


        '
Domain Status:

        '
Registered And Active Website

        '


        Dim Str As String = TextBox1.Text
        Dim StrA As String = "
"
        Dim StrB As String = "
"
        NsTextBox19.text = Split(Split(Str, StrA, 2)(1), StrB)(0)


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
550
Date d'inscription
jeudi 12 octobre 2006
Statut
Membre
Dernière intervention
6 juin 2015
4
Autre solution, le parse NewSchool:

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

        'La ligne qui nous interesse:
        '
Registered And Active Website

        '
        'Dans mon fichier A.TXT il y a ton code HTML
        'Pattern c'est la chaine a chercher après la découpe
        'Avec le code ci-dessous, lorsque l'on arrive à cette balise div
        'curRow contient ceci:
        'curRow(0) = ""
        'curRow(1) = div class="form-field wide-80"
        'curRow(2) = Registered And Active Website
        'curRow(3) = /div
        'curRow(4) = ""
        '
        'Lorsque je boucle chaque element de la découpe effectué par ReadField
        'Si l'element est = au pattern alors affiche: "trouvé"


        Dim MyReader As New FileIO.TextFieldParser("C:\Users\Duke49\Desktop\a.txt")
        Dim pattern As String = "Registered And Active Website"

        MyReader.TextFieldType = FileIO.FieldType.Delimited
        MyReader.TrimWhiteSpace = True
        MyReader.SetDelimiters(New String() {">", "<"})
        MyReader.HasFieldsEnclosedInQuotes = True

        Dim curRow As String()
        While Not MyReader.EndOfData
            curRow = MyReader.ReadFields

            For Each el As String In curRow
                If el = pattern Then
                    MessageBox.Show("trouvé")
                End If
            Next el
        End While

    End Sub
Bonjour,
Merci de m'aider mais je crois qu'on s'éloigne de mon probleme d'origine
Ce que je voudrai c'est simplement recuperer le texte "Registered And Active Website" sur un site en ligne (http://whois.domaintools.com/).
J'aurais par la suite besoin de recuperer d'autres textes sur ce site.
Quand je clique sur le bouton "TrackWebsite" ce texte doit s'afficher dans NsTextBox19.txt en fonction de l'url spécifiée dans "WebsiteIp.txt".
C'est pour cela que j'avais commencé à ecrire ceci pour me connecter au site:

    Private Sub TrackWebsite_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackWebsite.Click

        If WebsiteIp.Text.Length > 0 Then
            Dim url As String = ("http://whois.domaintools.com/" + WebsiteIp.Text)
            WebBrowser1.Navigate(url)
            While Not WebBrowser1.ReadyState = WebBrowserReadyState.Complete

                Application.DoEvents()

                InfoCollector2.Start()
                WebsiteTracking.Text = WebsiteIp.Text

            End While
        Else
            MsgBox("Please, insert an domain website")
        End If

    End Sub


Puis il me manque le code pour afficher le texte voulu dans NsTextBox19:

    Private Sub InfoCollector2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles InfoCollector2.Tick


'Code à écrire

        InfoCollector2.Stop()

    End Sub


Merci

je crois qu'on s'éloigne de mon probleme d'origine

Comment ça on s'éloigne ???
Et le code que je t'ai mis plus haut il fait quoi?
Maintenant ce que nous ne savons pas c'est quelle est ta difficulté réelle;
- Est-ce de récupérer le code html?
- est-ce de "trier" le texte déjà récupéré?

Fait tourner ce petit exemple:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        WebBrowser1.Navigate("http://www.pixelvision.free.fr/")
    End Sub

    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        '<title>Cf2i</title>
        'Exemple pour récupérer ce qui est entre les balises <title> et </title>
        Dim Str As String = WebBrowser1.DocumentText
        Dim BaliseA As String = "<title>"
        Dim BaliseB As String = "</title>"
        MsgBox(Split(Split(Str, BaliseA, 2)(1), BaliseB)(0))
    End Sub


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Oui désolé en fait ce qui me manquait c'était:
Dim Str As String = WebBrowser1.DocumentText


Par contre j'ai une erreur IndexOutOfRangeExeption sur la ligne:
NsTextBox19.Text = Split(Split(Str, StrA, 2)(1), StrB)(0)

Une idée d'où ca pourrait venir ?
Merci

IndexOutOfRangeExeption veut dire qu'une des balises n'existe pas, vérifie bien la syntaxe de StrA et StrB.

Ou sinon c'est qu'on ne lit pas la bonne page, affiche tout le texte lu dans une textbox et vérifie si
existe bien dans ce texte.

 Dim Str As String = TextBox1.Text
        Dim StrA As String = "
"
        Dim StrB As String = "
"
        NsTextBox19.text = Split(Split(Str, StrA, 2)(1), StrB)(0)



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Pourtant le code html est bien celui-ci:





Domain Status:


Registered And Active Website




J'ecris le code comme ceci:

        Dim Str As String = WebBrowser1.DocumentText
        Dim StrA As String = "
"

        Dim StrB As String = "
"
        NsTextBox19.Text = Split(Split(Str, StrA, 2)(1), StrB)(0)


Par contre
revient plusieurs fois dans la page html alors que <div id="ssTab-domainStatus" est unique puisque c'est l'id.
L'idéal serait de recuperer le texte grace à cette id.

Quand je le fais manuellement ça fonctionne

Ah... si le code html est volumineux il se peux qu'il nécessite plus de temps pour le charger dans ta variable

Essaye ceci:
 Dim Str As String = WebBrowser1.DocumentText
 Threading.Thread.Sleep(1000)
        Dim StrA As String = "
"
        Dim StrB As String = "
"
        NsTextBox19.Text = Split(Split(Str, StrA, 2)(1), StrB)(0)


Sinon envoie l'URL exacte de ta page web...


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Je viens de m'apercevoir que le site en question viens de restreintre l'acces au utilisateurs enregistrés...
Il me reste plus qu'a trouver un autre site.

Sinon j'aimerai comprendre la syntaxe de cette ligne si tu le veux bien

NsTextBox19.Text = Split(Split(Str, StrA, 2)(1), StrB)(0)


A quoi correspondent les numeros 2, 1, 0 ?
Merci à toi Acive ;)

        'Split par défaut, considère les espaces comme séparateur, exemple:
        Dim Str As String = "Ceci est le texte à découper"
        For Each Mot In Split(Str)
            MessageBox.Show(Mot)
        Next

        'Si nous avons un autre séparateur comme la vigule par exemple:
        Str = "Ceci,est,le,texte,à,découper"
        For Each Mot In Split(Str, ",")
            MessageBox.Show(Mot)
        Next

        'Ou par exemple si l'on décide que le séparateur est ":"
        Str = "Ceci,est,le:texte,à,découper"
        MessageBox.Show(Split(Str, ":")(0)) 'qui sera: 'Ceci,est,le'
        MessageBox.Show(Split(Str, ":")(1)) 'qui sera: 'texte,à,découper'

        'Dans le cas où on a besoin de lire le contenu entre deux "balises" ou bouts de texte:
        'On fait deux split (comme dans ton exemple)
        Str = "Nous avons ceci dans le texte à découper finalement"
        Dim MotDeDébut As String = "ceci"
        Dim MotDeFin As String = "finalement"
        MessageBox.Show(Split(Split(Str, MotDeDébut, 2)(1), MotDeFin)(0))
        'Et nous avons le texte entre le mot de début et le mot de fin à savoir " dans le texte à découper "



Infos plus détaillées SUR CE LIEN

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
550
Date d'inscription
jeudi 12 octobre 2006
Statut
Membre
Dernière intervention
6 juin 2015
4
johnspart, si tu cherche le top pour ce que tu veux faire, regarde à cette adresse: http://www.xenocafe.com/tutorials/vb.net/whois_client/index.php
Merci Active pour tes infos je commence à mieux comprendre.
Merci Duke49 pour ton lien c'est exactement ce que je recherche à faire.
Je mettrai le post en resolu dès que j'aurais reussi à faire ce que je veux.
Merci encore pour le temps que vous m'avez consacré.