2016-06-05 2 views
0

웹 페이지를 구문 분석하여 페이지의 모든 고유 한 문장을 반환합니다. 각 문장은 최소 두 단어로 구성됩니다. 거의 작동합니다. 다음은 페이지에 한 문장으로 표시되지만 내 코드는 <b></b> 태그의 텍스트를 삭제합니다. 굵은 태그 또는 강한 태그와 같은 다른 인라인 스타일의 텍스트가있는 브라우저에 나타나는 문장을 반환하는 인라인 스타일/태그를 제거하려면 어떻게합니까?HtmlAgilityPack을 사용하여 innerHtml에서 인라인 스타일을 제거하십시오.

현재 NHL 플레이 오프가 한 줄의 텍스트로 표시되고 다음 Takeaways가 첫 번째 Stanley Cup Final에서 Sharks가 펭귄을 두 번째 문장으로 이기면 정말 한 문장입니다.

<span class="titletext"><b>NHL Playoffs</b> Takeaways: Sharks beat Penguins for first Stanley Cup Final win</span> 

여기 내 asp.net vb.net 코드입니다 (C# 해결책은 괜찮습니다).

Public Shared Function validateIsMoreThanOneWord(input As String, numberWords As Integer) As Boolean 
     If String.IsNullOrEmpty(input) Then 
      Return False 
     End If 
     Return (input.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries).Length >= numberWords) 
    End Function 

    Private Sub form1_Load(sender As Object, e As EventArgs) Handles form1.Load 

     Try 

      Dim html = New HtmlDocument() 
      html.LoadHtml(New WebClient().DownloadString("http://news.google.ca/nwshp?hl=en&ei=4H1UV7-NNOfCjwTAl4bABw&ved=0EKkuCAkoBw")) 

      Dim root = html.DocumentNode 

      Dim myList As New List(Of String)() 

      For Each node As HtmlNode In root.Descendants().Where(Function(n) n.NodeType = HtmlNodeType.Text AndAlso n.ParentNode.Name <> "script" AndAlso n.ParentNode.Name <> "style" AndAlso n.ParentNode.Name <> "css") 

       If Not node.HasChildNodes Then 
        Dim text As String = HttpUtility.HtmlDecode(node.InnerText) 

        If Not String.IsNullOrEmpty(text) And Not String.IsNullOrWhiteSpace(text) Then 
         If validateIsMoreThanOneWord(text.Trim(), 2) Then 
          myList.Add(text.Trim()) 
         End If 
        End If 
       End If 
      Next 

      'remove dups from array and other stuff 
      Dim q As String() = myList.Distinct().ToArray() 

      For i As Integer = 0 To UBound(q) 
       Response.Write(q(i).Trim() & "<br/>") 
      Next 

      Response.Write(q.Count) 


     Catch ex As Exception 
      Response.Write(ex.Message) 
     End Try 
    End Sub 

희망 사항을 통해 해결책을 찾아 볼 수 있습니다. 감사!

답변

0

부모가 <script>도 아니고 <style>도 아니고 css도 아닌 모든 루트 자손 노드를 반복하므로 실제로 .titleText의 모든 자식 노드를 다른 텍스트로 취급합니다.

.titletext 항목을 검색하면됩니다.

다음은 C#에서 수행 할 작업입니다. 필요한 작업에 대한 아이디어를 얻을 수 있습니다.

HtmlWeb w = new HtmlWeb(); 
    var htmlDoc = w.Load("http://news.google.ca/nwshp?hl=en&ei=4H1UV7-NNOfCjwTAl4bABw&ved=0EKkuCAkoBw"); 
    var textTitles = htmlDoc.DocumentNode.SelectNodes("//span[@class='titletext']"); 

//for testing purposes 
     foreach (var textTitle in textTitles) 
      Console.WriteLine(textTitle.InnerText); 
+0

안녕 Veverke, 나는 페이지 (반드시이 일을) 크롤링 오전 사업부가이 유형의 서식을한다면 모르겠지만, 그것이 않는 경우 그냥 텍스트를 반환하고 싶습니다. 내가 가지고있는 코드로 이것이 가능한지 확실하지 않은가요? – Rob

+0

'HtmlNode' 객체의'InnerText'가 맞습니까? 나는 당신이 어디에서 왔는지 모른다면 어떻게 데이터를 추출 할 수 있는지 보지 못한다. 예를 들어,이 예제에서 'titletext'로 분류 된 span 노드는 데이터를 추출 할 위치를 알고있는 경우 위의 코드를 사용하여 텍스트 *를 얻을 수 있습니다 (분명히 선을 인쇄하지는 않지만 무엇이든 할 수 있습니다 그렇지 않으면 그들과 함께). 위의 코드는 그렇게하지 않을 것입니다. – Veverke

관련 문제