C#解析HTML神器 Html Agility Pack

曾经,我傻乎乎的用正则表达式成功的解析了学校的新闻网、教务管理系统、图书馆管理系统中我想要的所有的内容。那时候废了好大的劲写那正则啊,而且最后还是各种不给力,经常会有意想不到的bug出现,最后经过无数次修复才基本可以正常使用。但是还是很不爽的。后来看见别人用这个东西解析HTML,就感觉很强大,今天自己动手尝试了一下,当时几天的代码,用这个类库几分钟就搞定了。废话不多说,进入主题。

Html Agility Pack主页:http://htmlagilitypack.codeplex.com/

作者主页:http://zhoufoxcn.blog.51cto.com/792419/595344/

使用类库第一步:引用类库;

第二步:加载HTML文件:支持本地文件,也可以利用类库提供的document.LoadHtml()方法来加载远程的资源

第三步:获得根节点:

HtmlNode rootNode = document.DocumentNode;

第三步:在根节点下面要找你找的内容,这个我没有全部做尝试,下面是我做的一些测试代码,解析的是网易的新闻页;

 HtmlDocument document=new HtmlDocument();
            document.Load(@"E:\c.htm", Encoding.Default);
            HtmlNode rootNode = document.DocumentNode;
            HtmlNode titleNode = rootNode.SelectSingleNode("//h1[@id='h1title']");
            Console.WriteLine("-------------------------标题-------------------------------");
            Console.WriteLine(titleNode.InnerHtml);
            Console.WriteLine("-------------------------时间-------------------------------");
            HtmlNode timeNode = rootNode.SelectSingleNode("//div[@class='ep-info cDGray']/div[@class='left']");
            Console.WriteLine(timeNode.InnerHtml);
            Console.WriteLine("-------------------------正文-------------------------------");
            HtmlNode newsNode = rootNode.SelectSingleNode("//div[@class='end-text']");
            Console.WriteLine(newsNode.InnerHtml);
Console.ReadKey();

官方的文档告诉我们,可以使用如下的方法来获得根节点下面的一个或者多个子节点:

 /Articles/Article[1]:选取属于Articles子元素的第一个Article元素。 
 /Articles/Article[last()]:选取属于Articles子元素的最后一个Article元素。 
 /Articles/Article[last()-1]:选取属于Articles子元素的倒数第二个Article元素。 
 /Articles/Article[position()<3]:选取最前面的两个属于 bookstore 元素的子元素的Article元素。 
 //title[@lang]:选取所有拥有名为lang的属性的title元素。 
 //CreateAt[@type='zh-cn']:选取所有CreateAt元素,且这些元素拥有值为zh-cn的type属性。 
 /Articles/Article[Order>2]:选取Articles元素的所有Article元素,且其中的Order元素的值须大于2。 
 /Articles/Article[Order<3]/Title:选取Articles元素中的Article元素的所有Title元素,且其中的Order元素的值须小于3。

 下面列出了最有用的路径表达式:
 nodename:选取此节点的所有子节点。 
 /:从根节点选取。 
 //:从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 
 .:选取当前节点。 
 ..:选取当前节点的父节点

 

posted @ 2014-08-23 16:33  人生无赖  阅读(633)  评论(0编辑  收藏  举报