C#使用AngleSharp庫解析html文檔
一、簡介
AngleSharp:https://github.com/AngleSharp/AngleSharp
AngleSharp是一個.NET庫,使您能夠解析基于尖括號的超文本,例如HTML,SVG和MathML,該庫還支持未經(jīng)驗證的XML,AngleSharp的一個重要方面是CSS也可以解析。
AngleSharp與類似的庫(例如HtmlAgilityPack)相比的優(yōu)勢在于:
- 公開的DOM使用的是W3C官方指定的API,即,甚至在AngleSharp中也可以使用querySelectorAll之類的東西。
- 解析器還使用HTML 5.1規(guī)范,該規(guī)范定義了錯誤處理和元素校正。
AngleSharp庫專注于標準合規(guī)性,交互性和可擴展性。因此,它為使用C#的Web開發(fā)人員提供了從在任何現(xiàn)代瀏覽器中使用DOM所獲得的所有可能性。
官方實例:https://github.com/AngleSharp/AngleSharp.Samples
這個簡單的示例將使用Wikipedia的網(wǎng)站進行數(shù)據(jù)檢索。
var config = Configuration.Default.WithDefaultLoader(); var address = "https://en.wikipedia.org/wiki/List_of_The_Big_Bang_Theory_episodes"; var context = BrowsingContext.New(config); var document = await context.OpenAsync(address); var cellSelector = "tr.vevent td:nth-child(3)"; var cells = document.QuerySelectorAll(cellSelector); var titles = cells.Select(m => m.TextContent);
二、使用AngleSharp生成自動縮進格式化的html方法
1、操作DOM示例
//創(chuàng)建一個(可重用)解析器前端 var parser = new HtmlParser(); //html DOM節(jié)點 var source = " <h1>Some example source</h1> <p>This is a paragraph element</p> "; //解析源文件 var document = parser.Parse(source); //創(chuàng)建P標簽 var p = document.CreateElement("p"); p.TextContent = "This is another paragraph."; //添加到DOM document.Body.AppendChild(p); //返回完整html var html = document.DocumentElement.OuterHtml; ViewData["html"] = html;
效果展示
2、更改標簽屬性
給標簽添加自定義屬性
var parser = new HtmlParser(); //為以下源代碼生成HTML DOM var document = parser.Parse(" <ul> <li>First element</li> <li>Second element</li> <li>third</li> <li class='bla'>Last</li> </ul> "); //獲取所有l(wèi)i元素并將test屬性設(shè)置為值測試 var elements = document.QuerySelectorAll("li").Attr("test", "test"); //元素仍然包含所有l(wèi)i元素 ViewData["html"] = document.DocumentElement.OuterHtml;
效果展示
3、使用AngleSharp生成html代碼自動縮進格式化
var parser = new HtmlParser(); var document = parser.ParseDocument(text); using (var writer = new StringWriter()) { document.ToHtml(writer, new PrettyMarkupFormatter { Indentation = "\t", NewLine = "\n" }); var indentedText = writer.ToString(); }
4、使用AngleSharp下載獲取html代碼
var requester = new DefaultHttpRequester("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"); requester.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"); requester.Headers.Add("Referer", ""); requester.Headers.Add("Accept-Language", "zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3"); var context = BrowsingContext.New(Configuration.Default.WithLocaleBasedEncoding().WithDefaultLoader().WithDefaultCookies().With(requester)); //根據(jù)虛擬請求/響應(yīng)模式創(chuàng)建文檔 var document = context.OpenAsync(url).Result; using (var writer = new StringWriter()) { document.ToHtml(writer, new PrettyMarkupFormatter { Indentation = "\t", NewLine = "\n" }); var indentedText = writer.ToString(); }
5、爬取豆瓣美女圖片
新建一個Belle類用于保存獲取的圖片信息
/// /// 解析html /// public class Belle { /// /// 標題 /// public string Title { get; set; } /// /// 圖片地址 /// public string ImageUrl { get; set; } }
獲取html并解析
// 設(shè)置配置以支持文檔加載 var config = Configuration.Default.WithDefaultLoader(); // 豆瓣地址 var address = "https://www.dbmeinv.com/dbgroup/show.htm?cid=4"; // 請求豆辨網(wǎng) var document = BrowsingContext.New(config).OpenAsync(address); // 根據(jù)class獲取html元素 var cells = document.Result.QuerySelectorAll(".panel-body li"); // We are only interested in the text - select it with LINQ List list = new List(); foreach (var item in cells) { var belle = new Belle { Title= item.QuerySelector("img").GetAttribute("title"), ImageUrl= item.QuerySelector("img").GetAttribute("src") }; list.Add(belle); } ViewData["html"] = list;
到此這篇關(guān)于C#使用AngleSharp庫解析html文檔的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#構(gòu)造函數(shù)在基類和父類中的執(zhí)行順序
這篇文章介紹了C#構(gòu)造函數(shù)在基類和父類中的執(zhí)行順序,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04c#實現(xiàn)萬年歷示例分享 萬年歷農(nóng)歷查詢
這篇文章主要介紹了c#實現(xiàn)萬年歷的方法,可以顯示農(nóng)歷、節(jié)氣、節(jié)日、星座、星宿、屬相、生肖、閏年月、時辰,大家參考使用吧2014-01-01C#獲取Windows進程監(jiān)聽的TCP/UDP端口實例
本文介紹了C#獲取Windows下某進程監(jiān)聽的TCP/UDP端口的方法,希望對您有所幫助。2013-11-11