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 ??????
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!