如何解析html標籤內容?手寫正則表達式?htmlparser模塊幫你解決

這篇文章給大家介紹一個解析html內容的模塊——htmlparser。

舉一個簡單的應用場景:假設有一天領導需要你收集一下線上頁面已存在的靜態資源鏈接(js、css、img),你們的頁面很多,而且每個頁面的代碼量很大(比如上萬行),這種情況下你總不能人肉去搜索,那麼此時htmlparser這個模塊就可以派上用場了。

簡單使用

安裝命令

<code>

npm

install htmlparser/<code>
如何解析html標籤內容?手寫正則表達式?htmlparser模塊幫你解決

圖1

圖1中我們使用htmlparser模塊解析一個i.html文件,其內容如下:

如何解析html標籤內容?手寫正則表達式?htmlparser模塊幫你解決

圖2

解析結果如下:

如何解析html標籤內容?手寫正則表達式?htmlparser模塊幫你解決

圖3

圖3所示是個對象(此處序列化了便於顯示),遍歷這個對象就可以解決本文開頭所說的問題,這個模塊的用法非常的簡單。

原理分析

回到圖1,htmlparser模塊給我提供了一個Parser構造函數,這個構造函數是初始化的入口!它大概長這個樣子:

<code>

function

Parser

(

handler

)

{

this

._handler = handler; }/<code>

Parser接受一個參數handler,這個handler必須是一個對象,這個對象必須定義以下幾個方法:

  • reset方法主要做一些重置工作;
  • done方法完成解析後調用,此處可以執行自定義回調函數;
  • writeTag方法處理tag標籤;
  • writeText方法處理純文本信息
  • writeComment方法處理註釋信息;
  • writeDirective方法處理這樣的標籤信息,比如。

圖1中我們使用的是模塊內部提供的DefaultHandler,我們當然也可以自己定義handler。用別人的handler有時並不能完全滿足自己的業務場景,那麼我們操作一把,代碼如下:

如何解析html標籤內容?手寫正則表達式?htmlparser模塊幫你解決

圖4

圖4中我們自定義一個handler——CustomHandler,我們先運行一下看看各個方法都輸出了什麼?

如何解析html標籤內容?手寫正則表達式?htmlparser模塊幫你解決

圖5

圖5中CustomHandler的各個方法按照原始字符串的順序依次打印出了每個解析結果,這些解析結果是parser對象為我們自動生成的,解析的原理就是正則匹配。我們可以在自定義handler的各個函數方法中做一些特殊處理,然後把最終的結果通過done函數輸出出去。

圖4中的parseComplete方法也可以用以下邏輯代替,

<code>

parser

.reset

();

parser

.parseChunk

(

html

);

parser

.done

();/<code>

這個模塊除了可以在node環境中使用,它同時也可以在瀏覽器中使用,用法如下:

如何解析html標籤內容?手寫正則表達式?htmlparser模塊幫你解決

圖6

如何解析html標籤內容?手寫正則表達式?htmlparser模塊幫你解決

圖7

注意,如果在瀏覽器中使用,模塊的所有API都掛在了
Tautologistics.NodeHtmlParser這個對象上,其它用法一致。

總結

需要我們去解析html內容的場景非常多,之前我們更多的是使用自己寫的正則表達式去做,麻煩並且容易出錯。現在我們瞭解了htmlparser模塊,以後就可以直接使用它去解決問題。


分享到:


相關文章: