C# HtmlAgilityPack和AngleSharp 解析HTML


 C# HtmlAgilityPack和AngleSharp 解析HTML

by:wgscd

date:2018-1-17

 HtmlAgilityPack 有點是只有一個單獨DLL。AngleSharp 缺點是包含另外的一些DLL,如 Threading。

        現在我們可以用一個.NET下的HTML解析類庫HtmlAgilityPack。HtmlAgilityPack是一個支持用XPath來解析HTML的類庫,學習了解HtmlAgilityPack的API和XPath非常必要。

HtmlAgilityPack是一個開源的.NET類庫,它的主頁是http://htmlagilitypack.codeplex.com/,在這里可以下載到最新版的類庫及API手冊,此外還可以下載到一個用於調試的輔助工具。
XPath簡明介紹
XPath 使用路徑表達式來選取 XML 文檔中的節點或節點集。節點是通過沿着路徑 (path) 或者步 (steps) 來選取的。
下面列出了最有用的路徑表達式:
nodename:選取此節點的所有子節點。 
/:從根節點選取。 
//:從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。 
.:選取當前節點。 
..:選取當前節點的父節點。
例如有下面一段XML:
< ?xml version="1.0" encoding="utf-8" ?>
< articles>
<Article>
<Title>牛B的簡歷是神馬,如此神奇。</Title>
<Url>http://chebazi.net/showtopic-401.aspx</Url>
<CreateAt type="en">2011-04-07</CreateAt>
</Article>
<Article>
<Title lang="eng">
【功夫熊貓2】美國2011冒險動作動畫大片
</Title>
<Url>http://chebazi.net/showtopic-109.aspx</Url>
<CreateAt type="zh-cn">
2010年11月23日
</CreateAt>
</Article>
<Article>
<Title>
是爺們的必看,女生勿入!!!
</Title>
<Url>http://chebazi.net/showtopic-396.aspx</Url>
<CreateAt type="zh-cn">
2011年06月12日
</CreateAt>
</Article>
<Article>
<Title lang="eng">
曖昧
</Title>
<Url>http://www.iofeng.com/</Url>
<CreateAt type="zh-cn">
2007-09-08
</CreateAt>
</Article>
< /articles>


針對上面的XML文件,我們列出了帶有謂語的一些路徑表達式,以及表達式的結果:
/Articles/Article[1]:選取屬於Articles子元素的第一個Article元素。 
/Articles/Article[last()]:選取屬於Articles子元素的最后一個Article元素。 
/Articles/Article[last()-1]:選取屬於Articles子元素的倒數第二個Article元素。 
/Articles/Article[position()<3]:選取最前面的兩個屬於 bookstore 元素的子元素的Article元素。 
//title[@lang]:選取所有擁有名為lang的屬性的title元素。 
//CreateAt[@type='zh-cn']:選取所有CreateAt元素,且這些元素擁有值為zh-cn的type屬性。
/Articles/Article[Order>2]:選取Articles元素的所有Article元素,且其中的Order元素的值須大於2。 
/Articles/Article[Order<3]/Title:選取Articles元素中的Article元素的所有Title元素,且其中的Order元素的值須小於3。

HtmlAgilityPack API簡明介紹
在HtmlAgilityPack中常用到的類有HtmlDocument、HtmlNodeCollection、
HtmlNode和HtmlWeb等。
其流程一般是先獲取HTML,這個可以通過HtmlDocument的Load()或LoadHtml()來加載靜態內容,或者也可以HtmlWeb的Get()或Load()方法來加載網絡上的URL對應的HTML。
得到了HtmlDocument的實例之后,就可以用HtmlDocument的DocumentNode屬性,這是整個HTML文檔的根節點,它本身也是一個HtmlNode,然后就可以利用HtmlNode的SelectNodes()方法返回多個HtmlNode的集合對象HtmlNodeCollection,也可以利用HtmlNode的SelectSingleNode()方法返回單個HtmlNode。
HtmlAgilityPack實戰
http://www.hao123.com/game.htm為列獲取下面各項的鏈接和文字。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using HtmlAgilityPack;

public class Category
{
public string Subject { get; set; }
public string IndexUrl { get; set; }
}
public partial class _Default : System.Web.UI.Page
{
private const string CategoryListXPath = "//html[1]/body[1]/div[3]/center[1]/div[1]/table[1]/tr"; //關鍵點,不同網站分析不同的路徑
private const string CategoryNameXPath = "//td/a[1]"; //關鍵點,不同網站分析不同的路徑
private const string ChooseXPath = "//a[1]";
protected void Button1_Click(object sender, EventArgs e)
{
Uri url = new Uri(this.TextBox1.Text.Trim());
Uri uriCategory = null;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
WebResponse response = request.GetResponse();

Stream stream = response.GetResponseStream();
StreamReader read = new StreamReader(stream,Encoding.GetEncoding("gb2312"));
string str = read.ReadToEnd();

HtmlDocument html = new HtmlDocument();
html.LoadHtml(str);
HtmlNode rootNode = html.DocumentNode; 
HtmlNodeCollection categoryNodeList = rootNode.SelectNodes(CategoryListXPath); 
HtmlNode temp = null;
List<Category> list = new List<Category>(); 
foreach (HtmlNode categoryNode in categoryNodeList)

temp = HtmlNode.CreateNode(categoryNode.OuterHtml); 
HtmlNode singleNode = temp.SelectSingleNode(CategoryNameXPath);
if(singleNode == null)
continue;
HtmlNodeCollection singleList = temp.SelectNodes(CategoryNameXPath);
foreach(HtmlNode node in singleList)
{
HtmlNode createNode = HtmlNode.CreateNode(node.OuterHtml);
HtmlNode reNode = createNode.SelectSingleNode(ChooseXPath);
if (reNode == null)
continue;
Category category = new Category();
category.Subject = reNode.InnerText;
Uri.TryCreate(url, reNode.Attributes["href"].Value, out uriCategory);
category.IndexUrl = uriCategory.ToString();
list.Add(category); 

}

string re =null;
foreach (Category cate in list)

re +=string.Format("<tr><td><a href={0}>{1}</a></td></tr>",cate.IndexUrl,cate.Subject);
}
this.Literal1.Text = string.Format("<table>{0}</table>", re);
}
protected void Page_Load(object sender, EventArgs e)
{

}
}

       

 

 ----------------------test sample-----------------------------------------------------

 

        HtmlAgilityPack.HtmlDocument  doc = new  HtmlAgilityPack.HtmlDocument ();

          doc.LoadHtml("<div cl='tt'><a href=''>gggggg</a>gggg</div>");
          HtmlAgilityPack.HtmlNode node = doc.DocumentNode;
          var d= node.SelectSingleNode("div[@cl='tt']/a");
          string  i= d.InnerText;

 ------------------------------------------------------------------------------------------

 


AngleSharp是個開源項目,  主頁地址

AngleSharp 缺點是包含另外的一些DLL,如 Threading

 

 ----------------------------------------------sample--------------------------------------

var parser = new HtmlParser();
 //為以下源代碼生成HTML DOM
var document = parser.Parse("<ul><li>First element<li>Second element<li>third<li class=bla>Last");
//獲取所有li元素並將test屬性設置為值測試
var elements = document.QuerySelectorAll("li").Attr("test", "test");
 //元素仍然包含所有li元素
ViewData["html"] = document.DocumentElement.OuterHtml;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM