Utilisation de HTML Agility Pack pour récupérer du contenu textuel

html html-agility-pack vb.net

Question

Je vais essayer de mon mieux pour spécifique. Travailler essentiellement sur un robot d'exploration sur vb.net, ce qui m'intéresse davantage d'extraire le contenu textuel de la page. Mon application actuelle télécharge le corps de la source HTML dans une zone de texte à l'aide d'un contrôle de navigateur Web, comme suit:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)   Handles Button1.Click
    Dim url As String = "<url>"
    WebBrowser1.Navigate(url)
End Sub

Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As    System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
    TextBox2.Text = WebBrowser1.Document.Body.OuterHtml
End Sub

À partir de maintenant, textbox2 est constitué de fichiers junk html contenant href, img, annonces, scripts, etc.

Je pourrais appliquer des propriétés regex pour résoudre toutes les anomalies, mais je pense que HAP est beaucoup plus approprié pour l'analyseur HTML.

Une recherche ici m’a amené à cette page qui traite de l’utilisation de la technique de liste blanche mentionnée par 'Meltdown'

Balises de bande HTML Agility Pack NE SONT PAS DANS la liste blanche

Mais comment puis-je l'appliquer sur vb.net car cela semble être une bonne idée?

S'il vous plaît adivce les gars ..........

EDIT: J'ai trouvé une version vb.net du code ci-dessous, mais il semble y avoir une erreur à

If i IsNot DeletableNodesXpath.Count - 1 Then

Erreurs: IsNot nécessite des opérandes ayant des types de référence, mais cet opérande a la valeur type entier

Voici le code:

Public NotInheritable Classe HtmlSanitizer Private Sub Nouveau () End Sub Privé Partagé Lecture seule Liste blanche comme IDictionary (Of String, String ()) Partage privé DeletableNodesXpath comme nouvelle liste (Of String) ()

Shared Sub New()
    Whitelist = New Dictionary(Of String, String())() From { _
        {"a", New () {"href"}}, _
        {"strong", Nothing}, _
        {"em", Nothing}, _
        {"blockquote", Nothing}, _
        {"b", Nothing}, _
        {"p", Nothing}, _
        {"ul", Nothing}, _
        {"ol", Nothing}, _
        {"li", Nothing}, _
        {"div", New () {"align"}}, _
        {"strike", Nothing}, _
        {"u", Nothing}, _
        {"sub", Nothing}, _
        {"sup", Nothing}, _
        {"table", Nothing}, _
        {"tr", Nothing}, _
        {"td", Nothing}, _
        {"th", Nothing} _
    }
End Sub

Public Shared Function Sanitize(input As String) As String
    If input.Trim().Length < 1 Then
        Return String.Empty
    End If
    Dim htmlDocument = New HtmlDocument()

    htmldocument.LoadHtml(input)
    SanitizeNode(htmldocument.DocumentNode)
    Dim xPath As String = HtmlSanitizer.CreateXPath()

    Return StripHtml(htmldocument.DocumentNode.WriteTo().Trim(), xPath)
End Function

Private Shared Sub SanitizeChildren(parentNode As HtmlNode)
    For i As Integer = parentNode.ChildNodes.Count - 1 To 0 Step -1
        SanitizeNode(parentNode.ChildNodes(i))
    Next
End Sub

Private Shared Sub SanitizeNode(node As HtmlNode)
    If node.NodeType = HtmlNodeType.Element Then
        If Not Whitelist.ContainsKey(node.Name) Then
            If Not DeletableNodesXpath.Contains(node.Name) Then
                'DeletableNodesXpath.Add(node.Name.Replace("?",""));
                node.Name = "removeableNode"
                DeletableNodesXpath.Add(node.Name)
            End If
            If node.HasChildNodes Then
                SanitizeChildren(node)
            End If

            Return
        End If

        If node.HasAttributes Then
            For i As Integer = node.Attributes.Count - 1 To 0 Step -1
                Dim currentAttribute As HtmlAttribute = node.Attributes(i)
                Dim allowedAttributes As String() = Whitelist(node.Name)
                If allowedAttributes IsNot Nothing Then
                    If Not allowedAttributes.Contains(currentAttribute.Name) Then
                        node.Attributes.Remove(currentAttribute)
                    End If
                Else
                    node.Attributes.Remove(currentAttribute)
                End If
            Next
        End If
    End If

    If node.HasChildNodes Then
        SanitizeChildren(node)
    End If
End Sub

Private Shared Function StripHtml(html As String, xPath As String) As String
    Dim htmlDoc As New HtmlDocument()
    htmlDoc.LoadHtml(html)
    If xPath.Length > 0 Then
        Dim invalidNodes As HtmlNodeCollection = htmlDoc.DocumentNode.SelectNodes(xPath)
        For Each node As HtmlNode In invalidNodes
            node.ParentNode.RemoveChild(node, True)
        Next
    End If
    Return htmlDoc.DocumentNode.WriteContentTo()


End Function

Private Shared Function CreateXPath() As String
    Dim _xPath As String = String.Empty
    For i As Integer = 0 To DeletableNodesXpath.Count - 1
        If i IsNot DeletableNodesXpath.Count - 1 Then
            _xPath += String.Format("//{0}|", DeletableNodesXpath(i).ToString())
        Else
            _xPath += String.Format("//{0}", DeletableNodesXpath(i).ToString())
        End If
    Next
    Return _xPath
End Function
End Class

S'il vous plaît quelqu'un peut-il aider ??????

Réponse populaire

Au lieu d'utiliser IsNot , utilisez simplement <> . Lorsque vous vérifiez essentiellement que la valeur d’un entier n’est pas égale à celle d’un autre entier - 1.

Je crois que IsNot ne peut pas être utilisé sur des entiers.

edit: Je viens de remarquer que c'est super super vieux. Je viens de voir la date du 26 juillet!



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow