您的位置:首页 > Web前端 > HTML

HTML解析利器HtmlAgilityPack

2015-06-02 09:20 260 查看
  在以前的项目中周公曾有解析HTML的情况,当时是采用正则表达式一步步将无关的HTML注释及JS代码部分删除掉,然后再用正则表达式找出需要提取的部分,可以说使用正则表达式来做是一个比较繁琐的过程,特别是对于正则表达式不是很熟悉或者要处理的HTML很复杂的情况下。
  前两天在网上发现了一个.NET下的HTML解析类库HtmlAgilityPack。HtmlAgilityPack是一个支持用XPath来解析HTML的类库,它的主页是http://htmlagilitypack.codeplex.com/,在这里可以下载到最新版的类库及API手册,此外还可以下载到一个用于调试的辅助工具。

XPath简明介绍
  XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。

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

HtmlAgilityPack API简明介绍
  在HtmlAgilityPack中常用到的类有HtmlDocument、HtmlNodeCollection、HtmlNode和HtmlWeb等。
  其流程一般是先获取HTML,这个可以通过HtmlDocument的Load()或LoadHtml()来加载静态内容,或者也可以HtmlWeb的Get()或Load()方法来加载网络上的URL对应的HTML。
  得到了HtmlDocument的实例之后,就可以用HtmlDocument的DocumentNode属性,这是整个HTML文档的根节点,它本身也是一个HtmlNode,然后就可以利用HtmlNode的SelectNodes()方法返回多个HtmlNode的集合对象HtmlNodeCollection,也可以利用HtmlNode的SelectSingleNode()方法返回单个HtmlNode。

这段代码将采集到的首页html静态文本解析成Dom节点树,然后用Xpath表达式获取整个文档中class属性值为titlelnk。
    HtmlWeb htmlWeb = new HtmlWeb();
HtmlDocument htmlDoc = htmlWeb.Load(@"http://www.cnblogs.com/");
HtmlNodeCollection anchors = htmlDoc.DocumentNode.SelectNodes(@"//a[@class='titlelnk']");
foreach (HtmlNode anchor in anchors)
Response.Write(anchor.InnerHtml + "<br/>");
Response.End();

若需要抓取的节点有ID,类似“<div id='post_list'>value</div>”这种,那很简单只需调用GetElementbyId方法根据节点ID即可获 取所需节点。从而通过HtmlNode中的InnerText或Attribute属性来获取你想要的值。
//实例化HtmlAgilityPack.HtmlDocument对象
HtmlDocument doc = new HtmlDocument();
//载入HTML
doc.LoadHtml(mainData);

//根据HTML节点NODE的ID获取节点
HtmlNode navNode = doc.GetElementbyId("post_list");

但很多情况下HTML节点是没有ID的,那就需要通过XPATH语言来查找匹配所需节点(XPath教程)。
//实例化HtmlAgilityPack.HtmlDocument对象
HtmlDocument doc = new HtmlDocument();
//载入HTML
doc.LoadHtml(mainData);

//根据HTML节点NODE的ID获取节点
HtmlNode navNode = doc.GetElementbyId("post_list");
//根据XPATH来索引节点
//div[2]表示文章链接a位于post_list里面第3个div节点中
HtmlNode navNode2 = navNode.SelectSingleNode("//div[2]/h3/a");
//获取文章链接地址
string articleTitle = navNode2.Attributes["href"].Value.ToString();
//获取文章标题
string articleName = navNode2.InnerText;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: