텍스트 콘텐츠를 잡기 위해 Html Agility Pack 사용

html html-agility-pack vb.net

문제

나는 구체적으로 최선을 다할 것입니다. 기본적으로 vb.net의 크롤러에서 페이지의 텍스트 콘텐츠를 추출하는 데 더 많은 관심이 있습니다. 현재 응용 프로그램은 다음과 같이 웹 브라우저 컨트롤을 사용하여 텍스트 소스에서 HTML 소스 본문을 다운로드합니다.

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

이제부터 textbox2는 href, img, ads, script 등이 들어있는 정크 html로 구성되어 있지만이 모든 메타 데이터를 타고 일반 텍스트를 가져와야합니다.

내가 모든 예외를 타고 정규식 속성을 적용 할 수 있지만 HAP 훨씬 더 html 파서에 적합하다고 생각합니다.

여기에서 검색하면 'Meltdown'에 언급 된 화이트리스트 기술의 사용에 대해 논의하는이 페이지로 이동했습니다.

화이트리스트에없는 HTML 민첩성 팩 스트립 태그

하지만 좋은 생각처럼 보이지만 vb.net에서 어떻게 적용합니까?

얘들 아, 제발 ..........

편집 : 아래에 표시된 코드의 vb.net 버전을 발견했지만 오류가있는 것 같습니다.

If i IsNot DeletableNodesXpath.Count - 1 Then

오류 : IsNot에는 참조 유형이있는 피연산자가 필요하지만이 피연산자는 정수 유형의 값을가집니다.

다음은 코드입니다.

Public NotInheritable 클래스 HtmlSanitizer Private Sub New () End Sub 개인 공유 읽기 전용 허용 목록 IDictionary (Of String, String ()) 새 공유 목록으로 String () 중 개인 공유 DeletableNodesXpath ()

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

제발 누군가가 도와 드릴까요 ??????

인기 답변

IsNot 을 사용하는 대신 <> 사용하십시오. 기본적으로 정수의 값이 다른 정수 -1의 값과 같지 않은지 확인합니다.

나는 IsNot 을 정수에 사용할 수 없다고 생각한다.

편집 : 나는 이것이 슈퍼 슈퍼 오래된 알 것입니다. 방금 7 월 26 일자를 보았습니다!



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.