整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

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

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

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

          簡單使用

          安裝命令

          npm install htmlparser

          圖1

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

          圖2

          解析結果如下:

          圖3

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

          原理分析

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

          function Parser(handler) {
             this._handler = handler;
          }

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

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

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

          圖4

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

          圖5

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

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

          parser.reset();
          parser.parseChunk(html);
          parser.done();

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

          圖6

          圖7

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

          總結

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

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

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

          簡單使用

          安裝命令

          npm install htmlparser

          圖1

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

          圖2

          解析結果如下:

          圖3

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

          原理分析

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

          function Parser(handler) {
             this._handler = handler;
          }

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

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

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

          圖4

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

          圖5

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

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

          parser.reset();
          parser.parseChunk(html);
          parser.done();

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

          圖6

          圖7

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

          總結

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

          、匹配HTML開始標簽及結束標簽

          這段正則,為什么比網上搜索的復雜一些呢?主要是加了匹配特測情況的問題,避免BUG。

          舉例:<div debug=">" ></div>

          const reg_tags = /<((["'])+.*?|[^>])+>/g;

          開始和結束

          2、匹配HTML開始標簽

          const reg_tag_start = /<[^\\/]((["'])+.*?|[^>])+>/

          開始

          3、匹配HTML結束標簽

          const reg_tag_end = /<[\\/]+[^<>]*>*/

          結束


          4、匹配HTML標簽屬性

          const reg_tag_attrs = /(?<=\s)[\w:-]+(=(["']).*?)*/g;

          標簽屬性

          5、獲取HTML標簽屬性名與值

          const reg_tag_attr_info = /(^[^=]+|(?<=(['"])).*?(?=))/g;

          屬性名與值

          6、獲取HTML標簽的名稱

          const reg_tag_name = /(?<=<[\/\s]*)\w+(?=(\s+(?![\s=])|>))/;

          標簽名稱

          7、匹配HTML文檔類型聲明

          const reg_doctype = /<!doctype[^<>]*>*/i

          聲明

          8、匹配HTML文檔注釋

          const reg_tag_note = /<\!.*?>/

          注釋

          9、匹配HTML文本內容

          const reg_text = /(?<=<[\w]+.*?>)[\s\S]*?(?=</[\w]*?>)/

          文本


          10、其它

          //g 正則表達式后面加g,表示全局匹配。

          //i 正則表達式后面加i,表示不區分大小寫。

          [\u4e00-\u9fa5],表示匹配中文。

          中文

          [^\x00-\xff\u4e00-\u9fa5],表示匹配中文符號

          中文符號


          以上正則表達式,是在寫一個生成HTML抽象語法樹的工具時,不斷摸索出來。如果您有更好的寫法,歡迎交流。


          人人為我,我為人人,歡迎您的瀏覽,我們一起加油吧。


          主站蜘蛛池模板: 99偷拍视频精品一区二区| 精品一区二区三区波多野结衣| 中文字幕无线码一区| 78成人精品电影在线播放日韩精品电影一区亚洲 | 国产一区二区免费| 精品欧美一区二区在线观看| 78成人精品电影在线播放日韩精品电影一区亚洲 | 精品一区二区三区无码免费视频| 国产一区二区三区在线观看免费| 91国偷自产一区二区三区| 国产午夜精品免费一区二区三区| 日韩有码一区二区| 精品在线视频一区| 日本一区二区三区在线视频| 国产精品成人99一区无码| 精品久久久中文字幕一区 | 日韩制服国产精品一区| 亚洲国产精品一区二区第一页免 | 日本一区二区视频| 亚洲国产AV一区二区三区四区| 国产精品揄拍一区二区| 亚洲高清美女一区二区三区| 亚洲精品一区二区三区四区乱码| 亚欧免费视频一区二区三区| 亚洲国产精品一区第二页| 国产成人无码精品一区二区三区| 国产福利精品一区二区| 精品无码一区二区三区爱欲九九 | 国产第一区二区三区在线观看| 国产在线观看精品一区二区三区91| 成人免费一区二区无码视频| 精品亚洲福利一区二区| 一区二区三区在线看| 视频一区精品自拍| 精品人伦一区二区三区潘金莲| 国产91大片精品一区在线观看| 欧美激情国产精品视频一区二区| 国模视频一区二区| 大伊香蕉精品一区视频在线| 亚洲一区二区三区电影| 欧美亚洲精品一区二区|