日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用HtmlAgilityPack抓取网页数据

發布時間:2023/12/4 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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)]

總結

以上是生活随笔為你收集整理的使用HtmlAgilityPack抓取网页数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。