解析html和採集網頁的神兵利器

2022-04-04 12:27:55 字數 1575 閱讀 8422

在c#類檔案開頭引入using htmlagilitypack;就可以使用該命名空間下的型別了。實際使用中,幾乎都是以htmldocument類為主線的,這一點非常類似於微軟.net framework中的xmldocument類。xmldocument類是操作的是xml文件,而htmldocument類操作的是html文件(其實也可以操作xml文件),它們的操作方式都是基於dom,所不同的是後者取消了諸如getelementsbytagname這樣的方法,強化了getelementbyid方法(在htmldocument中可以直接使用,而xmldocument則不可以)。htmlagilitypack中定位節點基本上都用xpath表示式,xpath表示式的參考文件可見:

[csharp]view plain

copy

htmlweb htmlweb = new htmlweb();  

htmldocument htmldoc = htmlweb.load(@"");  

htmlnodecollection anchors = htmldoc.documentnode.selectnodes(@"//a[@class='titlelnk']");  

foreach (htmlnode anchor in anchors)  

response.write(anchor.innerhtml + "

");  

response.end();  

這段**將採集到的首頁html靜態文字解析成dom節點樹,然後用xpath表示式獲取整個文件中class屬性值為titlelnk的所有a元素。獲取節點最常用節點物件的兩個方法:selectnodes("xpath表示式")和selectsinglenode("xpath表示式"),前者返回節點集合htmlnodecollection的乙個例項;後者返回滿足條件的第乙個節點,型別為htmlnode的乙個例項。後面的foreach迴圈輸出每個a元素的內聯文字。

通常情況下,htmlagilitypack比正規表示式解析html更加高效準確,這體現在開發效率和執行效能兩方面。htmlagilitypack的靈活性也是非常好的。例如將上面**中的foreach迴圈體改成response.write(anchor.outerhtml + "

");則輸出的是超連結本身而非內聯文字。甚至可以修改超連結本身:

[csharp]view plain

copy

foreach (htmlnode anchor in anchors)  

這樣執行後你看到的是紅色的超連結。你可以幾乎隨心所欲地對htmlagilitypack解析生成的dom節點樹上的節點操作,就像你擁有一顆自己的聖誕樹,可以隨意對其修整剪裁。這也是正則方法無法相提並論的。htmlagilitypack對源文字的結構要求非常寬鬆,即使沒有根元素也一樣正常使用,這同要求非常嚴格的xmldocument完全不同。熟練掌握htmlagilitypack解析html文件的關鍵在於熟悉xpath表示式語法,好在xpath的語法入門比較簡單,只需花費數個小時基本就可滿足大部分應用。依託於dom高效而通用的結構,xpath強大而簡練的語法,htmlagilitypack真可以稱為「解析html和採集網頁的神兵利器」。

解析HTML中的float和margin的疑惑

對於html中的一些小疑惑,在這裡進行解析一下。div是基於行,就是乙個div佔據一行,不會讓別的元素,和自己同行。span 不是基於行的,就是乙個span 有空 專,不會單獨占用一行。css樣式的 float 浮動屬性,用於設定標籤物件 如 標籤盒子 標籤 標籤 標籤等html 標籤 的浮動布局 ...

02 解析和提取網頁中的資料

beautifulsoup解析資料的用法 bs物件 beautifulsoup 要解析的文字,解析器 在括號中,要輸入兩個引數,第0個引數是要被解析的文字,它必須是字串 括號中的第1個引數用來標識解析器 html.parser 並不唯一 提取資料 仍然使用beautifulsoup來提取資料。這一步...

HTML文件解析和DOM樹的構建

瀏覽器解析html文件生成dom樹的過程 以下是一段html 以此為例來分析解析html文件的原理 picture a paragraph of explanatory text.現在進入正題,講講自己對解析html文件構建dom樹的理解 此過程可分為兩個主要模組構成,即 1.標籤解析 這部分完成從...