首先介绍一下Jumony是什么,Jumony是一个.NET的开源项目,项目主页位于:http://jumony.codeplex.com/,采用LGPL协议发布。
Jumony试图提供在传统Web开发模型中许多难以解决问题的解决方案。一言蔽之,Jumony的一切基础建立在服务器端的HTML DOM之上。在服务器端将HTML(文件或动态网页技术的输出)按照客户端浏览器的处理方式解析为HTML DOM。操纵和处理HTML DOM,就像我们在客户端用JavaScript干的那些事情一样,不同的是,Jumony可以使你依托强大的.NET Framework,来解决以前用脚本和服务器端技术都难以解决的事情。
系列目录:
这是系列文章的第三篇,这个系列尝试一步步从一些最简单的例子开始了解怎么玩转Jumony。建议先从第一篇开始学习搭建Jumony环境,在本文的开始的时候,假设大家已经搭建好了Jumony的运行环境。
这一次我要谈到Jumony的HTML解析器,显然我自己写的简单的符合规范的HTML并不能说明解析器的功能。所以这一次我直接从互联网上随便抓一个页面来完成示范。
首先在项目中添加一个aspx文件,然后在上面放一个DataGrid来展示我们一会儿要抓取的成果,像是这样:
那么接下来,我们到Code Behind里面来添加一些代码,首先是要下载一个互联网的页面,我用新浪的首页来做示范,事实上你也可以换成任何你喜欢网站(例如博客园),下载网页最简单的方式当然是WebClient,不过记得添加using System.Net哦,同时我也把Jumony的一些引用都添加上了,像这样:
然后创建JumonyParser的实例,并调用其Parse方法将html分析成一个IHtmlDocument:
Jumony Milestone 1除了提供Jumony Parser分析HTML文档之外,还可以把HtmlAgilityPack分析的文档转换成Jumony的标准DOM模型。这使得HtmlAgilityPack也可以当作Jumony的一个Parser来使用,下面的代码展示了这一点:
不过,这么做之前要确保你引用了Ivony.Web.Html.HtmlAgilityPackAdaptor命名空间,AsDocument扩展方法便是在其中定义的。
HtmlAgilityPackAdaptor为HtmlAgilityPack的DOM对象提供了一个适配器,使得其可以满足Jumony标准DOM的要求,从而使用Jumony的方法来操作。理论上所有的HTML DOM和Parser都可以通过适配项目与Jumony适配。
这两种HTML Parser各有优劣,大家可以任选一种来完成这一次的例子。在这里我使用Jumony Parser来继续下面的例子。
分析了新浪的首页后,接下来就要干坏事了,首先把新浪首页上所有的链接全部取出来。由于链接都是<a>定义的,所以简单的用Find( "a" )就可以选择出来。但<a>除了可以定义链接,还可以定义锚点,我们并不需要取出页面上的锚点。所以我们用"a[href]",即包含href属性的a标签:
然后我们分析这些链接,将其目标URL取出来(即href属性),由于href可能是一个相对链接,所以我们用页面的地址 "http://www.sina.com.cn/" 作为基地址,重新计算出绝对的URL,然后我用LINQ表达式来对所有URL完成这样的操作,再放在一个匿名对象中:
可以看得出来,这些工作在服务器端完成的时候,是多么的简洁流畅,一气呵成。如果在客户端来完成这种事情,没有强大的.NET Framework作为后盾,一个简单的URL计算就可以难倒无数英雄好汉。
然后再为匿名对象添加一些其他有趣的属性,对链接排序,最后绑定到DataGrid上,最终的代码像这样:
由于DataGrid有自动生成列的特性,所以我们并不需要做些什么,它会自动的弄一个表格来展现这些数据,效果像是这样:
把抓取的网页换成博客园首页:
Jumony的确可以用来干各种各样的坏事,譬如说抓取页面,分析数据,或是新闻小偷什么的。从这一点来说,你可以说Jumony是邪恶的,但软件本来就是邪恶的,Jumony将一些很复杂的事情,提供了简单的解决方案,也许,这降低了干坏事的成本,但更多的时候,Jumony带来了生产力的飞跃。借助Jumony,我们能做的好玩的事情,要比这些邪恶的事情多多了不是么?
谢谢大家。