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