文档章节

黑马-程序员-C#解析HTML

victorruan
 victorruan
发布于 2014/07/16 09:52
字数 691
阅读 29
收藏 0

---------------------- 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培训、期待与您交流! ----------------------   

本文转载自:http://www.cnblogs.com/victorruan/archive/2012/12/23/2829759.html

victorruan
粉丝 0
博文 13
码字总数 0
作品 0
徐汇
私信 提问
JavaWeb01-HTML篇笔记(一)

1.1 案例一:网站信息页面的显示:1.1.1 需求: 在网页中显示网站的信息的页面:效果如下: 1.1.2 分析:1.1.2.1 技术分析: 【HTML的概述】 Ø 什么是HTML HTML:Hyper Text Markup Language ...

我是小谷粒
2018/04/25
0
0
【备忘】2017年黑马【淘宝店铺装修实战操作视频】全套无加密

2017年黑马【淘宝店铺装修实战操作视频】全套无加密 简介: 淘宝装修,对于一个好的店铺来讲,是至关重要的,因为客户只能从网上的文字和图片来了解您,了解产品,所以做得好能增加用户的信任...

qq_38155396
2017/07/01
0
0
PHP基础班学习经历

仿佛昨天还在开学(11月3号),一晃现在已经是23号了,时间就像流水一般匆匆溜走;回顾这大半个月的学习,用两个字来形容的话,那就是——充实; 1.黑马模式 话说回来,黑马的上课教学模式上...

洛根森
2017/11/26
0
0
2014年IT毕业生——年终总结与生存调查报告

从事IT行业的比例及薪资对比 2014年,近百万IT相关毕业生就业情况如何,都从事什么行业呢?据麦克斯2014年IT专业毕业生从业调查数据显示,仅有约45%的毕业生找到IT相关工作,那其余毕业生都从...

郭奕峰
2015/03/04
439
0
TIOBE编程语言排行榜:Objective-C蝉联“年度语言”

TIOBE发布了最新的编程语言排行版,Objective-C连续第2年获得“年度语言”殊荣。年度语言是指在上一年份额增长最多的语言。Objective-C最新的份额为10.283%,比去年同期增长了3.37%。在2010年...

oschina
2013/01/06
6.2K
46

没有更多内容

加载失败,请刷新页面

加载更多

vue v-html动态生成的html怎么加样式

1. v-html加样式 在vue开发中碰到需要动态生成html,并且需要有样式,这时候发现像往常一样写样式的时候不起作用,网上搜了一下,发现通过 v-html 创建的 DOM 内容不受作用域内的样式影响,但...

litCabbage
42分钟前
4
0
Appium+python自动化(三十三)- 测试环境和本地环境傻傻滴分不清楚-Remote(超详解)

  简介   在前边所有涉及启动app的时候有这样一行代码driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps),很多小伙伴们和同学们不知道这个ip和端口哪里来的,我...

开源仔
50分钟前
2
0
各种放大器电路之功率放大器的分析

  供给负载一定输出功率的放大器叫做功率放大器。它是收音机、扩音机或其他电子设备的末级,它推动扬声器发出声音,使电动机转动,使记录仪表动作等。功率放大器主要是考虑如何获得最大的输...

xyxyty
50分钟前
3
0
MySQL8.0.17 - Multi-Valued Indexes 简述

本文主要简单介绍下8.0.17新引入的功能multi-valued index, 顾名思义,索引上对于同一个Primary key, 可以建立多个二级索引项,实际上已经对array类型的基础功能做了支持 (感觉官方未来一定...

阿里云官方博客
今天
13
0
make4.1降级 make-3.81、2错误

在编译 make-3.82 的时候出现如下错误提示 glob/glob.c:xxx: undefined reference to `__alloca'` 修改 /glob/glob.c // #if !defined __alloca && !defined __GNU_LIBRARY__ # ifdef __GNUC......

Domineering
今天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部