HtmlParser解析思路彙總

HTMLParser使用方式彙總(適用C# JAVA):html

  1. Lexer模式:node

  2. NodeFilter模式web

  3. NodeVisitor模式ide

 

 

-----------------------------------------涯上月灬指香專用分割線---------------------------------------------spa

1. HTMLParser解析的數據來源:  htm

       WebClient webclient = new WebClient();
       String htmlContent = webclient.DownloadString("https://www.baidu.com/");blog

 

2. (Lexer模式)繼承

   使用依據: 該模式對總體數據負責,會返回一個線性的Node節點序列:rem

   使用方式:string

      Lexer lexer = new Lexer(htmlContent);
      Parser parser = new Parser();
      parser.Lexer = lexer;
      NodeList nodelist = parser.Parse(null);  //開始解析,返回一個全部節點的線性序列
      int size = nodelist.Size();
      Console.WriteLine("掃描節點數:" + nodelist.Size());
      for (int i = 0; i < size; i++)
       {
        INode node = nodelist.ElementAt(i);
        Console.WriteLine(node.ToString());
       }
      Console.WriteLine("掃描結束");

 

 

3. (NodeFilter模式)

       使用依據: 根據NodeFilter的要求過濾出符合要求的Node,只對結果負責

         使用方式:   

        Parser parser = new Parser();
        parser.InputHTML = htmlContent;
        NodeList nodelist = parser.Parse(new NodeClassFilter(typeof(Winista.Text.HtmlParser.Tags.ImageTag)));  //指定過濾出的標籤爲<Img>
        for (int i = 0; i < nodelist.Size(); i++)
          {
            ImageTag node = (ImageTag)nodelist.ElementAt(i);
            Console.WriteLine("href = {0}", node.ImageURL);
          }


        //若是沒有你須要的過濾節點類型,可自定義節點過濾器
        NodeList nodelist = parser.Parse(new CustomNodeFilter());
        for (int i = 0; i < nodelist.Size(); i++)
          {
            INode node = nodelist.ElementAt(i);
            Console.WriteLine(node.GetText());
          }

 

        class CustomNodeFilter : NodeFilter

        {


          public bool Accept(INode node)  //自定義過濾器的條件

            {
              if(node is MetaTag)
               {
                MetaTag tag = (MetaTag)node;
                if(tag.GetAttribute("title") != null)
                 {
                  return true;
                 }
               }
              return false;
            }
         }

    Ps:

    (繼承樹)

            

           

    (Tags 類型圖)

    

 

 

4. (NodeVisitor模式)

         使用條件: 須要瞭解Parser解析過程,該模式對過程負責

   使用方式:

          Parser parser = new Parser();
        parser.InputHTML = htmlContent;
        parser.VisitAllNodesWith(new CustomNodeVIsitor());

 

        class CustomNodeVIsitor: NodeVisitor
          {
            public override void BeginParsing()  //當開始解析Html時回調
              {
                Console.WriteLine("開始解析Html頁面");
              }

            public override void VisitTag(ITag tag) //當訪問到一對標籤的開始標籤時回調 ,像<html>...</html> 中的<html>
              {
                Console.WriteLine("開始解析TAG" + tag.TagName);
              }

            public override void VisitEndTag(ITag tag)  //當訪問到一對標籤的結束標籤時回調, 像<html>...</html>中的</html>

              {
                Console.WriteLine("結束解析TAG" + tag.TagName);
              }

            public override void VisitStringNode(IText string_Renamed)  //當訪問到文本標籤時回調, 像<div>我是內容</div>中的「我是內容」就是一個文本標籤
              {
                Console.WriteLine("掃描到文本標籤了");
              }

            public override void VisitRemarkNode(IRemark remark)  //當訪問到註釋標籤時,回調
              {
                Console.WriteLine("掃描到註釋標籤了");
              }
           }

相關文章
相關標籤/搜索