zoukankan      html  css  js  c++  java
  • 黑马程序员C#解析HTML

    ---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ---------------------- 

    在搜索引擎的开发中,我们需要对网页的Html内容进行检索,难免的就需要对Html进行解析。拆分每一个节点并且获取节点间的内容。此文介绍两种C#解析Html的方法。 第一种方法: 用System.Net.WebClient下载Web Page存到本地文件或者String中,用正则表达式来分析。这个方法可以用在Web Crawler等需要分析很多Web Page的应用中。 估计这也是大家最直接,最容易想到的一个方法。 转自网上的一个实例:所有的href都抽取出来:
    using System; using System.Net; using System.Text; using System.Text.RegularExpressions; namespace HttpGet {     class Class1     {         [STAThread]         static void Main(string[] args)         {             System.Net.WebClient client = new WebClient();             byte[] page = client.DownloadData("http://www.google.com");             string content = System.Text.Encoding.UTF8.GetString(page);             string regex = "href=[\\\"\\\'](http:\\/\\/|\\.\\/|\\/)?\\w+(\\.\\w+)*(\\/\\w+(\\.\\w+)?)*(\\/|\\?\\w*=\\w*(&\\w*=\\w*)*)?[\\\"\\\']";             Regex re = new Regex(regex);             MatchCollection matches = re.Matches(content);
                System.Collections.IEnumerator enu = matches.GetEnumerator();             while (enu.MoveNext() && enu.Current != null)             {                 Match match = (Match)(enu.Current);                 Console.Write(match.Value + "\r\n");             }         }     } }
    一些爬虫的HTML解析中也是用的类似的方法。 第二种方法:

    利用Winista.Htmlparser.Net 解析Html。这是.NET平台下解析Html的开源代码,网上有源码下载,百度一下就能搜到,这里就不提供了。并且有英文的帮助文档。找不到的留下邮箱。 个人认为这是.net平台下解析html不错的解决方案,基本上能够满足我们对html的解析工作。 自己做了个实例:

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Winista.Text.HtmlParser; using Winista.Text.HtmlParser.Lex; using Winista.Text.HtmlParser.Util; using Winista.Text.HtmlParser.Tags; using Winista.Text.HtmlParser.Filters;
    namespace HTMLParser {     public partial class Form1 : Form     {         public Form1()         {             InitializeComponent();             AddUrl();         }
            private void btnParser_Click(object sender, EventArgs e)         {             #region 获得网页的html             try             {
                    txtHtmlWhole.Text = "";                 string url = CBUrl.SelectedItem.ToString().Trim();                 System.Net.WebClient aWebClient = new System.Net.WebClient();                 aWebClient.Encoding = System.Text.Encoding.Default;                 string html = aWebClient.DownloadString(url);                 txtHtmlWhole.Text = html;             }             catch (Exception ex)             {                 MessageBox.Show(ex.Message);             }             #endregion
                #region 分析网页html节点             Lexer lexer = new Lexer(this.txtHtmlWhole.Text);             Parser parser = new Parser(lexer);             NodeList htmlNodes = parser.Parse(null);             this.treeView1.Nodes.Clear();             this.treeView1.Nodes.Add("root");             TreeNode treeRoot = this.treeView1.Nodes[0];             for (int i = 0; i 
    < htmlNodes.Count; i++)             {                 this.RecursionHtmlNode(treeRoot, htmlNodes[i], false);             }
                #endregion
            }
            private void RecursionHtmlNode(TreeNode treeNode, INode htmlNode, bool siblingRequired)         {             if (htmlNode 
    == null || treeNode == null) return;
                TreeNode current 
    = treeNode;             TreeNode content ;             //current node             if (htmlNode is ITag)             {                 ITag tag = (htmlNode as ITag);                 if (!tag.IsEndTag())                 {                     string nodeString = tag.TagName;                     if (tag.Attributes != null && tag.Attributes.Count > 0)                     {                         if (tag.Attributes["ID"] != null)                         {                             nodeString = nodeString + " { id=\"" + tag.Attributes["ID"].ToString() + "\" }";                         }                         if (tag.Attributes["HREF"] != null)                         {                             nodeString = nodeString + " { href=\"" + tag.Attributes["HREF"].ToString() + "\" }";                         }                     }                                          current = new TreeNode(nodeString);                     treeNode.Nodes.Add(current);                 }             }
                //获取节点间的内容             if (htmlNode.Children != null && htmlNode.Children.Count > 0)             {                 this.RecursionHtmlNode(current, htmlNode.FirstChild, true);                 content = new TreeNode(htmlNode.FirstChild.GetText());                 treeNode.Nodes.Add(content);             }
                //the sibling nodes             if (siblingRequired)             {                 INode sibling = htmlNode.NextSibling;                 while (sibling != null)                 {                     this.RecursionHtmlNode(treeNode, sibling, false);                     sibling = sibling.NextSibling;                 }             }         }         private void AddUrl()         {             CBUrl.Items.Add("http://www.hao123.com");             CBUrl.Items.Add("http://www.sina.com");             CBUrl.Items.Add("http://www.heuet.edu.cn");         }
            
        } }

    运行效果: 实现取来很容易,结合Winista.Htmlparser源码很快就可以实现想要的效果。
    小结: 简单介绍了两种解析Html的方法,大家有什么其他好的方法还望指教。

    ---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------   

  • 相关阅读:
    派生
    什么是类的继承
    python中一切皆对象
    类之属性查找
    类之 __init__方法

    MySql cmd下的学习笔记 —— 有关分组的操作(group by)
    MySql cmd下的学习笔记 —— 有关select的操作(max, min等常见函数)
    MySql cmd下的学习笔记 —— 有关select的操作(in, and, where, like等等)
    MySql cmd下的学习笔记 —— 有关表的操作(对表的增删改查)
  • 原文地址:https://www.cnblogs.com/victorruan/p/2829759.html
Copyright © 2011-2022 走看看