使用HtmlAgilityPack抓取網頁數據

XPath路徑表達式,主要是對XML文檔中的節點進行搜索,通過XPath表達式可以對XML文檔中的節點位置進行快速定位和訪問,html也是也是一種類似于xml的標記語言,但是語法沒有那么嚴謹,在codeplex里有一個開源項目HtmlAgilityPack,提供了用XPath解析HTML文件,下面掩飾如何使用該類庫的使用

首先說下XPath路徑表達式

XPath路徑表達式

  用來選取XML文檔中的節點或節點集的

  1、術語:節點(Node):7種類型:元素,屬性,文本,命名空間,處理命令,注釋,文檔(根)節點

  2、節點關系:父(Parent),子(Children),同胞(Sibling),先輩(Ancestor),后代(Descendant)

  3、路徑表達式

   nodename  節點名,選取此節點的所有子節點  例: childnode  當前節點中的childnode子節點,不包含孫子及以下的節點

      /    ?從根節點選取  例:/root/childnode/grandsonnode  

      ?//  ?  表示所有后代節點  例://childnode    所有名為childnode的后代節點

      .    表示當前節點  例:  ./childnode    表示當前節點的childnode節點

      ..    ?表示父節點  例:  ../nearnode     表示父親節點的nearnode子節點

?      @    選取屬性  /root/childnode/@id     表示childnode的所有含有id屬性的節點集

  4、謂語(Predicates)

    謂語可以對節點集進行一些限制,使選擇更精確

      /root/book[1]    節點集中的第一個節點

      /root/book[last()]  節點集中最后一個節點

      /root/book[position() - 1]  節點集中倒數第二個節點集

      /root/book[position() < 5]  節點集中前五個節點集

      /root/book[@id]      節點集中含有屬性id的節點集

      /root/book[@id='chinese']  節點集中id屬性值為chinese的節點集

      /root/book[price > 35]/title  節點集中book的price元素值大于35的title節點集

  5、通配符:XPath路徑中同樣支持通配符(*,@*,node(), text())

    例:  /bookstore/*

        //title[@*]

  6、XPath軸

    定義相對于當前節點的節點集

      ancestor    所有祖先節點

      attribute    所有屬性節點

      child      所有子元素

      descendant  所有后代節點(子,孫。。。)

      following    結束標記后的所有節點      preceding   開始標記前的所有節點

      following-sibling  結束標記后的所有同胞節點

      preceding-sibling  開始標記前的所有同胞節點

      namespace   當前命名空間的所有節點

      parent     父節點

      self       當前節點

    用法:軸名稱::節點測試[謂語]

      例:  ancestor::book

          ? child::text()

  7、運算符

    |  兩個節點集的合并  例:/root/book[1] | /root/book[3]

    +,-,*,dev,mod

    =,!=,<,>,<=,>=

    or,and  或和與

 

復制代碼
    //刪除注釋,script,style
    node.Descendants().Where(n => n.Name == "script" || n.Name == "style" || n.Name=="#comment").ToList().ForEach(n => n.Remove());//遍歷node節點的所有后代節點foreach(var HtmlNode in node.Descendants()){}
復制代碼

?

?

HtmlAgilityPack類庫用法

  1、首先需要獲取到html頁面數據,可以通過WebRequest類來獲取

?

復制代碼
        public static string GetHtmlStr(string url){    try{WebRequest rGet = WebRequest.Create(url);WebResponse rSet = rGet.GetResponse();Stream s = rSet.GetResponseStream();StreamReader reader = new StreamReader(s, Encoding.UTF8);return reader.ReadToEnd();}catch (WebException){//連接失敗return null;}}
復制代碼

?

  2、通過HtmlDocument類加載html數據

復制代碼
        string htmlstr = GetHtmlStr("http://www.hao123.com");HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();doc.LoadHtml(htmlstr);HtmlNode rootnode = doc.DocumentNode;    //XPath路徑表達式,這里表示選取所有span節點中的font最后一個子節點,其中span節點的class屬性值為num//根據網頁的內容設置XPath路徑表達式string xpathstring = "//span[@class='num']/font[last()]";    HtmlNodeCollection aa = rootnode.SelectNodes(xpathstring);    //所有找到的節點都是一個集合if(aa != null){string innertext = aa[0].InnerText;string color = aa[0].GetAttributeValue("color", "");    //獲取color屬性,第二個參數為默認值//其他屬性大家自己嘗試}
復制代碼

  也可以通過HtmlWeb類來獲得HtmlDocument

        HtmlWeb web = new HtmlWeb();HtmlAgilityPack.HtmlDocument doc = web.Load(url);HtmlNode rootnode = doc.DocumentNode;

?

補充:

  多個屬性條件查詢      //div[@align='center' and @height='24']

  不存在class屬性       //div[not(@class)]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286403.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286403.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286403.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言試題六之使字符串的前導*號不得多于n個;若多于n個,則刪除多于的*號;若少于或等于n個,則什么也不做。字符串中間和尾部的*號不刪除。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 請編寫函數…

QT坑爹的事..

昨晚用QT寫了個網絡小程序&#xff0c;布局怎么都出不來add->widge()無效&#xff0c;原來因為在QMainWindow的基類下 需要人工添加一個 widge new QWidge() this->setCentralWidget(widget);最后在 widget->setLayout(mainLayout);才行 dialog和widge的基類 則沒有任…

企業有了程序員為什么還要用 低代碼/無代碼

一、備受“爭議”的無代碼/低代碼開發 在看這篇內容時&#xff0c;我們要知道&#xff0c;技術無時無刻不在進行發展&#xff0c;IT技術更是如此&#xff0c;快速的技術更新使得程序員在進行應用開發時效率更高&#xff1b;我記得在十多年前&#xff0c;開發一個普通的 HTML 頁…

【三維激光掃描技術】原理、方法及實驗圖文教程目錄

《三維激光掃描技術》專欄講述目前最先進、最流行的三維激光技術&#xff0c;包括三維激光掃描技術原理&#xff0c;三維測距原理&#xff0c;國內外三維掃描設備&#xff0c;點云特點&#xff0c;三維建模&#xff0c;三維激光優勢、應用領域&#xff0c;應用技術案例等。 文章…

std::thread 不 join

std::thread 構造之后 使用 detach。就可以了

求最長回文串

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 轉載于:https://www.cnblogs.com/yangscode/p/5017527.html

C語言試題七之將函數字符串中的前導*號全部刪除,中間和尾部的*號不刪除。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 規定輸入字…

Dapr 1.7 之 Unix Domain socket 他來了

Unix Domain socketA UNIX socket is an inter-process communication mechanism that allows bidirectional data exchange between processes running on the same machine.Unix Domain Socket&#xff08;后面統一簡稱 UDS&#xff09;是在socket的框架上發展出一種IPC&…

實訓三(cocos2dx 3.x 打包apk)

上一篇文章《實訓二&#xff08;cocos2dx 2.x 打包apk&#xff09;》簡單的講述的利用cocos2dx 2.x引擎在windows平臺上打包apk的方法與過程&#xff0c;本文將介紹3.x版本引擎&#xff0c;如何打包apk的問題。 首先&#xff0c;Cygwin在3.x版本引擎上已經用不到了&#xff0c;…

學習SQL數據查詢,這一篇就夠了!

【任務概述】 建立數據庫的目的主要是為了對數據庫進行操作,以便能夠從中提取有用的信息,而數據查詢則是數據庫操作的核心。 擴展閱讀:《學習SQL數據更新,這一篇就夠了!》 文章目錄 一、SQL簡單查詢1. Select查詢語句2. 無條件查詢3. 單條件查詢4. 多條件查詢5. 分組查詢6…

網頁精美動效/動畫制作 按鈕鼠標懸浮動效基礎 01《炫彩網頁 iVX 無代碼動效/動畫制作》

編輯器地址&#xff1a;https://editor.ivx.cn/ 一、準備工作 進入編輯頁后&#xff0c;選擇其中一種應用類型創建應用&#xff0c;在此以相對應用作為示例&#xff1a; 創建好應用后在此選擇對應的屏幕作為示例演示&#xff0c;在此選擇電腦屏幕作為對應的大小&#xff1a…

Java并發編程 - Executor,Executors,ExecutorService, CompletionServie,Future,Callable

一、Exectuor框架簡介 Java從1.5版本開始&#xff0c;為簡化多線程并發編程&#xff0c;引入全新的并發編程包:java.util.concurrent及其并發編程框架&#xff08;Executor框架&#xff09;。 Executor框架是指java 5中引入的一系列并發庫中與executor相關的一些功能類&a…

C語言試題八之計算下列級數和,和值由函數值返回 S=1+x+x^2/2! + x^3/3!+…x^n/n!

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 計算下列級…

with管理文件操作

為了避免打開文件后忘記關閉&#xff0c;可以通過管理上下文&#xff0c;即&#xff1a; with open(log,r) as f: f.write(xxxxxx)f.readlines()...................如此方式&#xff0c;當with代碼塊執行完畢時&#xff0c;內部會自動關閉并釋放文件資源。以往我們打開…

學習SQL數據更新,這一篇就夠了!

【任務描述】 數據查詢不能改變數據庫中的數據,僅僅是把數據庫中符號條件的某些信息反饋給用戶。一個數據庫若要保持數據的正確性、及時性、則要依賴于數據庫的更新功能。數據更新主要包括插入數據、修改數據和刪除數據。 擴展閱讀:《學習SQL數據查詢,這一篇就夠了!》 文章…

網頁精美動效/動畫制作 按鈕鼠標懸浮動效的注意點 02《炫彩網頁 iVX 無代碼動效/動畫制作》

一、按鈕動效的使用 在上一節中&#xff0c;我們創建了一個動效&#xff0c;但是并沒有使用&#xff0c;在此我們給按鈕設置一個懸浮事件&#xff0c;當鼠標懸浮在按鈕之上后就調用該動效&#xff0c;點擊按鈕添加事件&#xff1a; 點擊按鈕添加事件后將會出現一個事件編輯框…

WPF 實現帶明細的環形圖表

本文經原作者授權以原創方式二次分享&#xff0c;歡迎轉載、分享。原文作者&#xff1a;普通的地球人原文地址&#xff1a;https://www.cnblogs.com/tsliwei/p/7155616.htmlGithub地址&#xff1a;https://github.com/WPFDevelopersOrg/WPFDevelopers.Charts大體思路圖表使用Ar…

SQL Server 2008 R2 安裝時提示“Reporting Services目錄數據庫文件存在”

打開MSSQL數據庫管理系統的安裝目錄&#xff0c;例如&#xff1a; X:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA。 其中 X:\是你安裝MS SQL數據庫管理系統實例所在的盤符. 刪除 X:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DA…

C語言試題九之s=(ln(1)+ln(2)+ln(3)+…+ln(m))^0.5,s作為函數值返回

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、 題目 計算:s=…

幾行代碼搞定樹形文本轉XML和JSON

由于需要將百度腦圖的內容導出為xml或者json格式&#xff0c;發現百度腦圖只能導出為樹形文本&#xff0c;所以就寫了個小應用給編輯用。/// <summary>/// 樹形文本轉xml/// </summary>/// <param name"txt"></param>/// <returns><…