使用HtmlAgilityPack抓取網頁資料

2021-09-06 14:43:23 字數 3248 閱讀 9276

剛剛學習了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)

catch

(webexception)

}

2、通過htmldocument類載入html資料

string htmlstr = gethtmlstr("

");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

)

也可以通過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)]

使用GraphEdit使用

1 註冊元件。其實乙個filter就是乙個com元件,所以使用之前需要註冊,可以有兩種方法對元件進行註冊。1.直接使用命令。命令列下輸入 regsvr32 hqtlystd.ax 編譯之後你會在工程目錄下的debug中找到hqtlystd.ax,這個就是要用的filter 即可註冊成功。2.vc6....

MySQL使用學習使用 mysql學習使用

1 mysql學習 1 安裝 ubuntu下直接安裝 apt get install mysql server 2 檢查伺服器是否啟動 sudo netstat tap grep mysql,如果啟動成功,出現以下資訊 tcp00localhost.localdomain mysql listen ...

學習使用CSDN markdown使用

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...