HtmlAgilityPack 是一个灵活的Html解析器,支持LinQ,它可以让分析HTML就像分析XML一样简单,使用时首先要得到html,然后对节点进行操作即可.
常用的方法
HtmlDocument类代表html文档,例:
HtmlDocument doc=new HtmlDocument();
doc.Load("file.html")从文件加载html
doc.LoadHtml()从指定字符加载html
HtmlWeb类 从http获取HTML文档
HtmlWeb web=new HtmlWeb();
HtmlDocument doc=web.Load("http://www.kuiyu.net");
web.Get(url, path)//获取指定url的html文档并保存到指定路径
2.操作html中节点
HtmlDocument中DocumentNode属性是整个Html文档的根节点,本身是HtmlNode
HtmlNode的SelectNodes()方法返回多个HtmlNode的集合对象HtmlNodeCollection
HtmlNode的SelectSingleNode()返回单个HtmlNode
3.实例
3.1加载一个html文档,并修改文档内容
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using HtmlAgilityPack;
- namespace HtmlAgility
- {
- class Program
- {
- static void Main(string[] args)
- {
- HtmlDocument doc = new HtmlDocument();
- doc.Load("file.htm");
- //遍历所有a标签
- foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
- {
- HtmlAttribute att = link.Attributes["href"];
- att.Value = "http://www.kuiyu.net";
- }
- doc.Save("file.htm");
- }
- }
- }
3.2加载一个url
- HtmlWeb hw = new HtmlWeb();
- HtmlDocument doc = hw.Load("http://www.kuiyu.net");
- //遍历所有a标签
- foreach(HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
- {
- HtmlAttribute att = link.Attributes["href"];
- Response.Write(att.Value);
- }
3.3节点操作
- <ul class="tab">
- <li class="on"><a href="http://www.baidu.com">百度</a></li>
- <li><a href="http://www.sina.com.cn" >新浪</a></li>
- <li><a href="http://v.bitauto.com">网易</a></li>
- <li><a href="http://www.360.cn">360</a></li>
- </ul>
得到上面代码中链接名称
- //得到使用class="tab"的ul
- var nodes = doc.DocumentNode.SelectNodes("//ul[@class='tab']");
- if (nodes != null)
- //遍历ul下顶级子节点
- foreach (HtmlNode node in nodes.Nodes())
- { //找出li中的a标签
- var a = node.SelectSingleNode("a");
- //li中最后一个a标签
- //var a=node.SelectSingleNode("./a[last()]");
- if(a!=null)
- tt += a.InnerText;
- }
如果页面是JS生成的代码,可以直接复制生成的代码字符,或用webbrowser获取
可以使用火狐firebug插件或谷歌浏览器,查看html 右击元素选择"复制XPath"可以快速得到元素位置
xpath实例
//*[@class='root'] 表示所有使用class='root'的节点
./a 表示当前节点下所有a节点
./ul[@class='tree-item-box']/li 当前节点下ul使用class='tree-item-box'下的li
./a/big 当前节点下a下的big元素