Hello 好久不見 哈哈,今天給大家分享一個解析Html的類庫 Html Agility Pack。這個適用於想獲取某網頁裡面的部分內容。今天就拿我的Csdn的博客列表來舉例。
打開頁面 用Firebug 找到文章列表的內容區域
如上面圖片 我們已經找到了想要的內容 在Html 中的位置
那麼接下來 第一步就是獲取Html 然後 用Html Agility Pack 找出我們想要的東西
1. 獲網頁的Html
1 #region 獲取文章列表 +GetHtml(string url)
2 /// <summary>
3 /// 獲取文章列表 Add shuaibi 2015-03-08
4 /// </summary>
5 /// <param name="url">頁面地址</param>
6 /// <returns>文章列表</returns>
7 public List<Model> GetHtml(string url)
8 {
9 var myWebClient = new WebClient();
10 var myStream = myWebClient.OpenRead(url);
11 var list = GetMessage(myStream); //這裡調用的是下面的方法
12 if (myStream != null) myStream.Close();
13 return list;
14 }
15 #endregion
2. 用Html Agility Pack 找出我們想要的東西
#region 處理文章信息 +GetMessage(Stream myStream)
/// <summary>
/// 處理文章信息 Add shuaibi 2015-03-08
/// </summary>
/// <param name="myStream">網頁的數據流</param>
/// <returns></returns>
private static List<Model> GetMessage(Stream myStream)
{
var document = new HtmlDocument();
document.Load(myStream, Encoding.UTF8);
var rootNode = document.DocumentNode;
var messageNodeList = rootNode.SelectNodes(MessageListXPath);
return messageNodeList.Select(messageNode => HtmlNode.CreateNode(messageNode.OuterHtml)).Select(temp => new Model
{
Title = temp.SelectSingleNode(MessageNameXPath).InnerText,
Href = "http://blog.csdn.net" + temp.SelectSingleNode(MessageNameXPath).Attributes["href"].Value,
Content = temp.SelectSingleNode(MessageContxtXPath).InnerText,
Time = Convert.ToDateTime(temp.SelectSingleNode(MessageTimeXPath).InnerText),
ComeFrom = "csdn"
}).ToList();
}
#endregion
看完上面說完了方法和步驟 細心的你是不是發現的什麼問題。哈哈,說一半天了都沒說這類庫怎麼用,還有第二個方法裡面那幾個變量是啥。
現在來說怎麼獲取 Html Agility Pack 下載地址http://htmlagilitypack.codeplex.com/ 下載後解壓壓縮包就會發現HtmlAgilityPack.dll 在項目中右鍵添加引用就可以了
然後就是 幾個變量的問題了
1.下面這句話是 獲取全部 class為list_item article_item開始的div
/// <summary>
/// 獲取文章列表
/// </summary>
private const string MessageListXPath = "//div[starts-with(@class,'list_item article_item')]";
2.下面這句話是 獲取上面獲取出來的集合裡面每一項的標題
/// <summary>
/// 獲取標題 解釋: 第一個div,下的第一個div,下的第一個h1,下的第一個span,下的第一個a標簽
/// </summary>
private const string MessageNameXPath = "/div[1]/div[1]/h1[1]/span[1]/a[1]";
3.和上面一樣這個是獲取內容
/// <summary>
/// 獲取內容 解釋: 第一個div,下的第二個div
/// </summary>
private const string MessageContxtXPath = "/div[1]/div[2]";
4.這個是獲取發布時間
/// <summary>
/// 獲取時間 這個就是 獲取 第一個div,下的第3個div,下的span
/// </summary>
private const string MessageTimeXPath = "/div[1]/div[3]/span";
上面這些代碼都是 根據第一張圖片來的。
第二次發,說的不好請見諒。希望和大家成為盆友共同進步嘿嘿
最後附上實體內的代碼
using System;
namespace MessageHelper
{
public class Model
{
public string Title { get; set; } //標題
public string Content { get; set; } //內容
public string Href { get; set; } //文章鏈接
public string ComeFrom { get; set; } //來源
public DateTime Time { get; set; } //發布時間
}
}