在开发过程中我们经常需要加载其他网站的内容,或者分析人家网站的数据结构,这时候如果使用原生的xmlReader来做的话会很累,而且效率还不一定高,今天我就来分享一个开源的html解析利器:C#的HtmlAgilityPack
HtmlAgilityPack的官网是http://htmlagilitypack.codeplex.com/.在官网上我们可以下载到最新的dll库.
先简单介绍XPath
XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。
下面列出了最有用的路径表达式:
nodename:选取此节点的所有子节点。
/:从根节点选取。
//:从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
.:选取当前节点。
..:选取当前节点的父节点。
1、获取网页1
title:doc.DocumentNode.SelectSingleNode("//title").InnerText;
解释:XPath中“//title”表示所有title节点。SelectSingleNode用于获取满足条件的唯一的节点。
2、获取所有的超链接:1
doc.DocumentNode.Descendants("a")
3、获取name为kw的input,也就是相当于getElementsByName\(\)
:1
var kwBox = doc.DocumentNode.SelectSingleNode("//input[@name='kw']");
解释:”//input[@name=’kw’]”也是XPath的语法,表示:name属性等于kw的input标签。
关于XPath的完整内容可以参考:http://www.w3school.com.cn/xpath/
HtmlAgilityPack API简明介绍
在HtmlAgilityPack中常用到的类有HtmlDocument
、HtmlNodeCollection
、HtmlNode
和HtmlWeb
等。
经常使用到的方法包括
Load
SelectNodes
SelectNodeCollection
SelectSingleNode
其流程一般是先获取HTML,这个可以通过HtmlDocument的Load()或LoadHtml()来加载静态内容,或者也可以HtmlWeb
的Get()或Load()方法来加载网络上的URL对应的HTML。
得到了HtmlDocument
的实例之后,就可以用HtmlDocument
的DocumentNode
属性,这是整个HTML文档的根节点,它本身也是一个HtmlNode
,然后就可以利用HtmlNode
的SelectNodes\(\)
方法返回多个HtmlNode
的集合对象HtmlNodeCollection
,也可以利用HtmlNode
的SelectSingleNode
()方法返回单个HtmlNode
。
初始化HtmlDocument类的实例:1
HtmlAgilityPack.HtmlWeb hw = new HtmlAgilityPack.HtmlWeb\(\);
加载某一个url :1
HtmlAgilityPack.HtmlDocument doccc = hw.Load(http://www.baidu.com/);
获取到某个节点:1
HtmlAgilityPack.HtmlDocument doc= doccc.SelectSingleNode("XPath");
获取节点内容可以使用InnerHTML
或者InnerTEXT
方法;
编码问题
如果你在获取中文内容的过程中发现了乱码,则需要检查页面的编码,其一般会在页面的head
标签内:1
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
然后在加载该url之前更改HtmlWeb的编码1
hw.OverrideEncoding = Encoding.Default;//将加载文档的编码改为默认