在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
【转】 HTML解析:基于XPath的C#类库HtmlAgiliytyPack 最近处于毕业设计开始阶段,前期工作需要去国外的一些专业数据库网站比对一些所需TF家族信息,为了快捷方便,想到用程序去帮助实现。前期实现了一系列的尝试,使用C#的的网络编程类库,获取查询结果,但是为了分析其中的结果并进行比对,我最开始尝试了两天之久的正则表达式,最后发现在解析这样的HTML文档的时候,花费时间太多,因此开始改变策略,最后得知MSHTML和HAP这两个.NET解析html的类库,出于对HAP这个轻量级类库兴趣,决定使用它来解析获取信息。 HAP是codeplex公司的一个解析html的.NET开源项目,支持XPath查询。官网(http://htmlagilitypack.codeplex.com/)给出的介绍是: What is exactly the Html Agility Pack (HAP)? 目前最新版本为HAP1.4.6,推出的新特性是支持Linq语言。 二、XPath为了更好的使用HAP,必须了解XPath语言。维基百科介绍如下: XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。 XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快的被开发者采用来当作小型查询语言。 XPath中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释、根节点。节点关系有:Parent、Children、Sibling、Ancestor、Descendent。 路径表达式用来选取节点或节点集,通过路径(path)或步(steps)进行选取。 节点表达式:
通配符:
选取多个路径时,使用 “ | ”符号。 步(Step):语法为 轴名称::节点测试[谓语] 轴(axis)-------------------------------定义所选节点与当前节点之间的树关系 节点测试(node-test)----------------识别某个轴内部的节点 零个或多个谓语(predicate)--------更深入提炼所选的节点集 XPath轴:
XPath可以使用运算符:
XPath有一百多个函数,常用在谓语中选择的函数有 position() 表示当前节点的序号 last() 表示取最后一个节点 name() 表示当前节点名字 在.NET中可以使用XPath处理XML文档,此处的html解析就是运用XPath查询选择。 三、HAP使用1、下载HtmlAgilityPack最新压缩包,http://htmlagilitypack.codeplex.com/releases/view/90925,官方下载地址。 2、加压后,在所需项目中添加引用HtmlAgilityPack.dll文件,其中还附带了xml文件用于文档说明。然后添加using HtmlAgilityPack说明。如下图所示: 3、实际使用中,都是以HtmlDocument类为主线。HAP提供了两种不同方式加载HtmlDocument类的实例:从html字符串构造(可以使用LoadHtml方法和Load方法),从html文档流构造实例(使用Load方法)。从而就可以实例化一个DOM实例,对于客户端脚本语言JavaScript熟悉的开发者来说这是非常熟悉的。这些操作也与.net framework中的XmlDocument类对于XML文档的操作非常类似,而且XML操作中也支持使用XPath表达式的查询使用,不同的是HtmlDocument强化了GetElementById方法,可以直接使用定位。示例代码如下:
HtmlDocument hd = new HtmlDocument(); hd.LoadHtml(fileStr); HtmlNode root = hd.DocumentNode; HtmlNodeCollection hNodes = root.SelectNodes("//tr[@class='odd']|//tr[@class='even']/td[@class='rowNum']"); 4、后续的使用需要依照自己的实际需求来设计。对于html文档的解析主要就是使用XPath表达式进行选择定位,可以参考http://www.w3school.com.cn/xpath/xpath_syntax.asp。 5、去除script和style等标签。当使用document.DocumentNode.InnerText获取文档内容时会包含script等标签,因此可以使用下面的方法去除: foreach(var script in doc.DocumentNode.Descendants("script").ToArray()) script.Remove(); foreach(var style in doc.DocumentNode.Descendants("style").ToArray()) style.Remove(); foreach(var comment in doc.DocumentNode.SelectNodes("//comment()").toArray()) comment.Remove(); 6、在下载的HtmlAgilityPack压缩包中还找到了关于WindowsPhone开发需要的dll文件,因此对于开发WP手机应用也是非常的有效。 HtmlAgilityPack对于html页面的解析、信息采集的准确度和效率都优于使用正则表达式,而且对开发者非常友好,特别是正则表达式的学习曲线较陡,而且其中包含了很多的技巧,特别是对高效的正则表达式的书写是非常需要经验的。HtmlAgilityPack获取html文档时对原文本的结构要求是非常宽松的,这与XmlDocument的严格要求是不同的。基本上熟悉了XPath的语法之后,大部分应用都可以满足要求了。 参考资料: 1、HAP:简单好用的html解析器:http://msdn.microsoft.com/zh-tw/ee787055.aspx 2、XPath维基百科:http://zh.wikipedia.org/zh-cn/XPath 3、W3C school:http://www.w3school.com.cn/xpath/xpath_syntax.asp 4、C#:HtmlAgilityPack extract inner text:http://stackoverflow.com/questions/2785092/c-htmlagilitypack-extract-inner-text |
请发表评论