Verwenden von Html Agility Pack zum Abrufen von Textinhalt

html html-agility-pack vb.net

Frage

Ich werde mein Bestes versuchen, um genau zu sein. Ich arbeite hauptsächlich an einem Crawler in vb.net, wobei ich mehr daran interessiert bin, den Textinhalt der Seite zu extrahieren. Meine aktuelle Anwendung lädt den Hauptteil der HTML-Quelle in ein Textfeld, indem sie ein Webbrowser-Steuerelement wie folgt verwendet:

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

Ab jetzt besteht textbox2 aus junk html, das href, img, ads, script usw. enthält, aber ich muss mich von all diesen Metadaten überzeugen und den Klartext greifen.

Ich könnte Regex-Eigenschaften anwenden, um von allen Anomalien zu profitieren, aber ich denke, HAP ist viel besser geeignet für HTML-Parser.

Die Suche hier brachte mich auf diese Seite, die die Verwendung von Whitelist- Technik diskutiert, die von "Meltdown" erwähnt wird

HTML-Agility-Pack-Strip-Tags NICHT IN der Whitelist

Aber wie kann ich es in vb.net anwenden, wie es eine gute Idee scheint?

Bitte advce Jungs ..........

EDIT: Ich habe eine vb.net-Version des unten gezeigten Codes gefunden, aber es scheint einen Fehler zu geben

If i IsNot DeletableNodesXpath.Count - 1 Then

Fehler: IsNot benötigt Operanden mit Referenztypen, aber dieser Operand hat den Wert integer

Hier ist der Code:

Öffentliche NotInheritable-Klasse HtmlSanitizer Private Sub Neu () End Sub Private Freigegebene ReadOnly-Whitelist als IDictionary (Of String, String ()) Privater freigegebener DeletableNodesXpath als neue 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

Bitte kann jemand helfen ??????

Beliebte Antwort

Anstatt IsNot , verwenden Sie einfach <> . Wie Sie grundsätzlich überprüfen, ist der Wert einer Ganzzahl nicht gleich dem Wert einer anderen Ganzzahl - 1.

Ich glaube, dass IsNot nicht für Ganzzahlen verwendet werden kann.

edit: Ich habe gerade gemerkt, dass das super super alt ist. Habe gerade das Datum vom 26. Juli gesehen!




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum