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。
若需要抓取的节点有ID,类似“<div id='post_list'>value</div>”这种,那很简单只需调用GetElementbyId方法根据节点ID即可获 取所需节点。从而通过HtmlNode中的InnerText或Attribute属性来获取你想要的值。
但很多情况下HTML节点是没有ID的,那就需要通过XPATH语言来查找匹配所需节点(XPath教程)。
前两天在网上发现了一个.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;
相关文章推荐
- 正则表达式匹配Html标签
- 初识HtmlParser.Net
- 【推荐】.NET批量上传控件——HtmlInputFiles (转)
- HTML DOM Document 对象
- HTML辅助方法的练习一
- Html-input文本框只能输入数字
- 第001讲 html介绍 html运行原理
- html 复选框checkbox
- as3 htmlText 的bug
- HTML语义化标签(一)
- 总结-html
- html图片无法显示
- 网页html中嵌入特殊字体
- Html表格自动换行
- 如何显示html代码到新窗口界面中
- HTML textarea输入框限制长度
- 18_块元素和内联元素.html
- 16_列表、边框.html
- html 积少成多
- 5_iframe.html