分享

介绍C#解析HTML的两种方法

 集微笔记 2013-08-13

在搜索引擎的开发中,我们需要对网页的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   ”rn”);
  23.             }
  24.         }
  25.     }
  26. }

一些爬虫的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 == null) return;
  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.”);
  103.         }
  104.     }
  105. }

运行效果:

运行效果

实现取来很容易,结合Winista.Htmlparser源码很快就可以实现想要的效果。

小结:

简单介绍了两种C#解析Html的的方法,大家有什么其他好的方法还望指教。

Tags:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多