HtmlAgilityPack是一个开源的解析HTML元素的类库,最大的特点是可以通过XPath来解析HMTL,如果您以前用C#操作过XML,那么使用起HtmlAgilityPack也会得心应手。目前最新版本为1.4.6,下载地址如下:http://htmlagilitypack.codeplex.com/ 目前稳定的版本是1.4.6,上一次更新还是2012年,所以很稳定,基本功能全面,也没必要更新了。
提到HtmlAgilityPack,就必须要介绍一个辅助工具,不知道其他人在使用的时候,是如何分析页面结构的。反正我是使用官方提供的一个叫做HAPExplorer的工具。非常有用。下面我们在使用的时候会介绍如何使用。
还是以辽宁省为例:http://www.tianqihoubao.com/lishi/ln.htm ,打开页面,右键获取网页源代码后,粘贴到 HAPExplorer 中,也可以直接在HAPExplorer 中打开链接,如下面的动画演示:
我们可以看到,右侧的XPath地址,div结束后,下面都是dl标签,就是我们要采集的行了。下面我们用代码来获取上述结构。先看看获取页面源代码的代码:
1
2
3
4
5
6
7
8
9
10
|
public static string GetWebClient( string url) { string strHTML = "" ; WebClient myWebClient = new WebClient(); Stream myStream = myWebClient.OpenRead(url); StreamReader sr = new StreamReader(myStream, Encoding.Default); //注意编码 strHTML = sr.ReadToEnd(); myStream.Close(); return strHTML; } |
public
static
void
ParsePageByArea(String cityCode)
{
//更加链接格式和省份代码构造URL
String url = String.Format(
"http://www.tianqihoubao.com/lishi/{0}.htm"
, cityCode);
//下载网页源代码
var
docText = HtmlHelper.GetWebClient(url);
//加载源代码,获取文档对象
var
doc =
new
HtmlDocument(); doc.LoadHtml(docText);
//更加xpath获取总的对象,如果不为空,就继续选择dl标签
var
res = doc.DocumentNode.SelectSingleNode(
@"/html[1]/body[1]/div[1]/div[6]/div[1]/div[1]/div[3]"
);
if
(res !=
null
)
{
var
list = res.SelectNodes(
@"dl"
);
//选择标签数组
if
(list.Count < 1)
return
;
foreach
(
var
item
in
list)
{
var
dd = item.SelectSingleNode(
@"dd"
).SelectNodes(
"a"
);
foreach
(
var
node
in
dd)
{
var
text = node.InnerText.Trim();
//拼音代码要从href属性中进行分割提取
var
herf = node.Attributes[
"href"
].Value.Trim().Split(
'/'
,
'.'
);
Console.WriteLine(
"{0}:{1}"
, text, herf[herf.Length - 2]);
}
}
}
}
源地址:http://www.cnblogs.com/asxinyu/p/CSharp_HtmlAgilityPack_XPath_Weather_Data.html