1. 程式人生 > >介紹C#解析HTML的兩種方法

介紹C#解析HTML的兩種方法

在搜尋引擎的開發中,我們需要對網頁的Html內容進行檢索,難免的就需要對Html進行解析。拆分每一個節點並且獲取節點間的內容。此文介紹兩種C#解析Html的方法。

    C#解析Html的第一種方法:

    用System.Net.WebClient下載Web Page存到本地檔案或者String中,用正則表示式來分析。這個方法可以用在Web Crawler等需要分析很多Web Page的應用中。

    估計這也是大家最直接,最容易想到的一個方法。

    轉自網上的一個例項:所有的href都抽取出來:

  1. using System;  
  2. using System.Net;  
  3. using System.Text;  
  4. using System.Text.RegularExpressions;  
  5. namespace HttpGet  
  6. {  
  7.     class Class1  
  8.     {  
  9.         [STAThread]  
  10.         static void Main(string[] args)  
  11.         {  
  12.             System.Net.WebClient client = new WebClient();  
  13.             byte[] page = client.DownloadData("http://www.google.com");  
  14.             string
     content = System.Text.Encoding.UTF8.GetString(page);  
  15.             string regex = "href=[\\\"\\\'](http:\\/\\/|\\.\\/|\\/)?\\w+(\\.\\w+)*(\\/\\w+(\\.\\w+)?)*(\\/|\\?\\w*=\\w*(&\\w*=\\w*)*)?[\\\"\\\']";  
  16.             Regex re = new Regex(regex);  
  17.             MatchCollection matches = re.Matches(content);  
  18.             System.Collections.IEnumerator enu = matches.GetEnumerator();  
  19.             while (enu.MoveNext() && enu.Current != null)  
  20.             {  
  21.                 Match match = (Match)(enu.Current);  
  22.                 Console.Write(match.Value + "\r\n");  
  23.             }  
  24.         }  
  25.     }  

    一些爬蟲的HTML解析中也是用的類似的方法。

    C#解析Html的第二種方法:

    利用Winista.Htmlparser.Net 解析Html。這是.NET平臺下解析Html的開原始碼,網上有原始碼下載,百度一下就能搜到,這裡就不提供了。並且有英文的幫助文件。找不到的留下郵箱。

    個人認為這是.net平臺下解析html不錯的解決方案,基本上能夠滿足我們對html的解析工作。

    自己做了個例項:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Windows.Forms;  
  9. using Winista.Text.HtmlParser;  
  10. using Winista.Text.HtmlParser.Lex;  
  11. using Winista.Text.HtmlParser.Util;  
  12. using Winista.Text.HtmlParser.Tags;  
  13. using Winista.Text.HtmlParser.Filters;  
  14. namespace HTMLParser  
  15. {  
  16.     public partial class Form1 : Form  
  17.     {  
  18.         public Form1()  
  19.         {  
  20.             InitializeComponent();  
  21.             AddUrl();  
  22.         }  
  23.         private void btnParser_Click(object sender, EventArgs e)  
  24.         {  
  25.             #region 獲得網頁的html  
  26.             try 
  27.             {  
  28.                 txtHtmlWhole.Text = "";  
  29.                 string url = CBUrl.SelectedItem.ToString().Trim();  
  30.                 System.Net.WebClient aWebClient = new System.Net.WebClient();  
  31.                 aWebClient.Encoding = System.Text.Encoding.Default;  
  32.                 string html = aWebClient.DownloadString(url);  
  33.                 txtHtmlWhole.Text = html;  
  34.             }  
  35.             catch (Exception ex)  
  36.             {  
  37.                 MessageBox.Show(ex.Message);  
  38.             }  
  39.             #endregion  
  40.             #region 分析網頁html節點  
  41.             Lexer lexer = new Lexer(this.txtHtmlWhole.Text);  
  42.             Parser parser = new Parser(lexer);  
  43.             NodeList htmlNodes = parser.Parse(null);  
  44.             this.treeView1.Nodes.Clear();  
  45.             this.treeView1.Nodes.Add("root");  
  46.             TreeNode treeRoot = this.treeView1.Nodes[0];  
  47.             for (int i = 0; i <  htmlNodes.Count; i++)  
  48.             {  
  49.                 this.RecursionHtmlNode(treeRoot, htmlNodes[i], false);  
  50.             }  
  51.             #endregion  
  52.         }  
  53.         private void RecursionHtmlNode(TreeNode treeNode, INode htmlNode, bool siblingRequired)  
  54.         {  
  55.             if (htmlNode == null || treeNode == nullreturn;  
  56.             TreeNode current = treeNode;  
  57.             TreeNode content ;  
  58.             //current node  
  59.             if (htmlNode is ITag)  
  60.             {  
  61.                 ITag tag = (htmlNode as ITag);  
  62.                 if (!tag.IsEndTag())  
  63.                 {  
  64.                     string nodeString = tag.TagName;  
  65.                     if (tag.Attributes != null && tag.Attributes.Count > 0)  
  66.                     {  
  67.                         if (tag.Attributes["ID"] != null)  
  68.                         {  
  69.                             nodeString = nodeString + " { id=\"" + tag.Attributes["ID"].ToString() + "\" }";  
  70.                         }  
  71.                         if (tag.Attributes["HREF"] != null)  
  72.                         {  
  73.                             nodeString = nodeString + " { href=\"" + tag.Attributes["HREF"].ToString() + "\" }";  
  74.                         }  
  75.                     }  
  76.                     current = new TreeNode(nodeString);  
  77.                     treeNode.Nodes.Add(current);  
  78.                 }  
  79.             }  
  80.             //獲取節點間的內容  
  81.             if (htmlNode.Children != null && htmlNode.Children.Count > 0)  
  82.             {  
  83.                 this.RecursionHtmlNode(current, htmlNode.FirstChild, true);  
  84.                 content = new TreeNode(htmlNode.FirstChild.GetText());  
  85.                 treeNode.Nodes.Add(content);  
  86.             }  
  87.             //the sibling nodes  
  88.             if (siblingRequired)  
  89.             {  
  90.                 INode sibling = htmlNode.NextSibling;  
  91.                 while (sibling != null)  
  92.                 {  
  93.                     this.RecursionHtmlNode(treeNode, sibling, false);  
  94.                     sibling = sibling.NextSibling;  
  95.                 }  
  96.             }  
  97.         }  
  98.         private void AddUrl()  
  99.         {  
  100.             CBUrl.Items.Add("http://www.hao123.com");  
  101.             CBUrl.Items.Add("http://www.sina.com");  
  102.             CBUrl.Items.Add("http://www.heuet.edu.cn");  
  103.         }  
  104.     }  

    執行效果:

執行效果 

    實現取來很容易,結合Winista.Htmlparser原始碼很快就可以實現想要的效果。

    小結:

    簡單介紹了兩種C#解析Html的的方法,大家有什麼其他好的方法還望指教。