C#使用HtmlAgilityPack實(shí)現(xiàn)解析提取HTML內(nèi)容
寫在前面
HtmlAgilityPack是一個(gè)HTML解析類庫(kù),日常用法就是爬蟲獲取到內(nèi)容后,先用XPath獲取目標(biāo)節(jié)點(diǎn),再用正則進(jìn)行匹配;使用XPath的目的主要是將目標(biāo)節(jié)點(diǎn)或內(nèi)容限定在一個(gè)較小的范圍,如果一上來就用正則那效率肯定不行,因?yàn)檎齽t的規(guī)則設(shè)計(jì)耗時(shí)較長(zhǎng);而XPath直接可以用瀏覽器F12開發(fā)者工具窗口,鼠標(biāo)右鍵復(fù)制XPath獲得,非常方便。但在微觀內(nèi)容的操作上XPath就顯得太粗糙了,這時(shí)候就需要用正則來匹配,由于范圍已經(jīng)用XPath做過了篩選,所以此時(shí)的正則規(guī)則的設(shè)計(jì)要考慮的就很少了;兩者結(jié)合效率就大大提升了,解析HTML源碼實(shí)在是個(gè)耗時(shí)費(fèi)力的體力活。
老套路通過NuGet獲取類庫(kù)
代碼實(shí)現(xiàn)
using HtmlAgilityPack; public static class HtmlDocumentMgr { #region Public Methods public static HtmlNodeCollection GetNodes(string xPath) { var body = BrowserController.GetFrameBody(); var doc = GetHtmlDocument(body); return doc.DocumentNode.SelectNodes(xPath); } public static HtmlNode GetNode(string xPath) { var body = BrowserController.GetFrameBody(); var doc = GetHtmlDocument(body); return doc.DocumentNode.SelectSingleNode(xPath); } public static HtmlDocument GetHtmlDocument(string html) { var doc = new HtmlDocument(); doc.LoadHtml(html); return doc; } #endregion }
HTML 內(nèi)容可以是獨(dú)立爬蟲直接獲取的,也可以從內(nèi)嵌瀏覽器中獲得,本文采用內(nèi)嵌瀏覽器的方式,獲得HTML的代碼如下,僅做參考示意。
public static string GetFrameBody() { var js = "document.querySelector('body').outerHTML"; var evalRet = Browser.MainFrame.EvaluateScriptAsync(js); evalRet.Wait(); if (evalRet.Result != null) { var ret = evalRet.Result.Result; return ret.ToNormalString(); } return string.Empty; }
調(diào)用示例
public static HtmlNode GetDescribeNode(string describe) { var body = BrowserController.GetFrameBody(); var doc = new HtmlDocument(); doc.LoadHtml(body); var match = string.Format(".//label[contains(text(), \"{0}\")]", describe); var labelNode = doc.DocumentNode.SelectSingleNode(match); if (labelNode == null && describe.Contains(" ")) { describe = describe.Replace(" ", " "); match = string.Format(".//label[contains(text(), \"{0}\")]", describe); labelNode = doc.DocumentNode.SelectSingleNode(match); } return labelNode; }
到此這篇關(guān)于C#使用HtmlAgilityPack實(shí)現(xiàn)解析提取HTML內(nèi)容的文章就介紹到這了,更多相關(guān)C# HtmlAgilityPack解析HTML內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)的文件操作封裝類完整實(shí)例【刪除,移動(dòng),復(fù)制,重命名】
這篇文章主要介紹了C#實(shí)現(xiàn)的文件操作封裝類,結(jié)合完整實(shí)例形式分析了C#封裝文件的刪除,移動(dòng),復(fù)制,重命名等操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-03-03ftp服務(wù)器搭建部署與C#實(shí)現(xiàn)ftp文件的上傳的示例
本文主要介紹了ftp服務(wù)器搭建部署與C#實(shí)現(xiàn)ftp文件的上傳的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07C#?Sqlite數(shù)據(jù)庫(kù)的搭建及使用技巧
這篇文章主要介紹了C#?Sqlite數(shù)據(jù)庫(kù)的搭建及使用技巧,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08C#使用dynamic一行代碼實(shí)現(xiàn)反射操作
dynamic的出現(xiàn)讓C#具有了弱語(yǔ)言類型的特性。編譯器在編譯的時(shí)候不再對(duì)類型進(jìn)行檢查,編譯時(shí)默認(rèn)dynamic對(duì)象支持你想要的任何特性,這篇文章主要介紹了C#用dynamic一行代碼實(shí)現(xiàn)反射操作,需要的朋友可以參考下2023-04-04c#實(shí)現(xiàn)萬(wàn)年歷示例分享 萬(wàn)年歷農(nóng)歷查詢
這篇文章主要介紹了c#實(shí)現(xiàn)萬(wàn)年歷的方法,可以顯示農(nóng)歷、節(jié)氣、節(jié)日、星座、星宿、屬相、生肖、閏年月、時(shí)辰,大家參考使用吧2014-01-01C#實(shí)現(xiàn)實(shí)體類和XML相互轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)實(shí)體類和XML相互轉(zhuǎn)換的資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03