使用NodeJS解析chrome書籤

平時在PC上積累了很多Chrome書籤,一直但願能在其餘地方使用,但在導出到其它瀏覽器,尤爲是手機瀏覽器的時候遇到很多困難。雖然能夠經過谷歌帳號同步書籤,可是由於總所周知的緣由,存在諸多不便。因而寫了個小程序,將chrome的html書籤解析成json格式,方便拓展使用。html

具體步驟

  1. 在chrome書籤管理器頁面導出html格式書籤;git

  2. 因爲導出的html格式存在許多未閉合的標籤,爲方便以後的操做,使用chrome打開書籤html文件;github

  3. chrome會自動補齊標籤,調用開發者工具,將html複製保存;chrome

  4. 使用NodeJS解析書籤html文件。json

html書籤

補齊前書籤是這樣的,DT標籤,p標籤都未閉合小程序

<DL><p>
    <DT><H3 ADD_DATE="1446270688" LAST_MODIFIED="1475726879">書籤欄</H3>
    <DL><p>
         <DT><A HREF="https://github.com/" ADD_DATE="1469689056">GitHub</A>
    <DL><p>
</DL><p>

補齊標籤後的html數組

<dl><p></p>
    <dt>
        <h3 add_date="1446270688" last_modified="1475726879">書籤欄</h3>
        <dl><p></p>
            <dt><a href="https://github.com/" add_date="1469689056">GitHub</a></dt>
        </dl>
    </dt>
</dl><p></p>

NodeJS程序

使用cheerio來執行dom操做,執行步驟瀏覽器

  1. 首先,讀取補齊後的html書籤;dom

  2. 得到最外層dt元素工具

  3. 從最外層dt元素開始遍歷dom樹,其中h3標籤爲文件夾名稱,A標籤包含書籤名稱、書籤地址等信息;

  4. 將書籤和文件夾存儲爲對象,同一文件夾下的書籤和文件夾對象的集合存儲爲數組;

  5. 將最終的對象轉化爲json字符串,存儲到json文件

var cheerio = require('cheerio'),
    fs = require('fs');

// 讀取書籤html文件
fs.readFile('bookmarks.html', 'utf-8',function(err,data){
    if(err){
        console.log("error");
    }else{
        parse(data);
    }
});

function parse(html){

    // 加載html,使用經常使用的$符號
    var $ = cheerio.load(html);

    // 獲取最外層的dt標籤
    var $dl = $("dl").first();
    var $dt = $dl.children("dt").eq(0);

    // 從dt開始遍歷dom樹,生成對象
    var obj = foo($dt);

    // 將對象轉化爲json字符串,添加額外參數使json格式更易閱讀
    var s = JSON.stringify(obj, null, 4);

    // 將json字符串寫入json文件
    fs.writeFileSync('output.json', s);

    function foo($dt){

        // h3標籤爲文件夾名稱
        var $h3 = $dt.children("h3");

        if($h3.length == 0){

            // a標籤爲網址
            var $a = $dt.children("a");

            // 返回該書籤的名稱和網址組成的對象
            return $a.length > 0 ? {"name": $a.text(),"href": $a.attr('href')} : null;
        }

        var h3 = $h3.text();
        var arr = [];
        var obj = {};

        // 獲取下一級dt標籤集合
        var $dl = $dt.children("dl");
        var $dtArr = $dl.children("dt");
        for(var i = 0; i < $dtArr.length; i++){

            // 遍歷下一級dt標籤
            var tmp = foo($dtArr.eq(i));

            // 將返回的對象push至子文件數組
            arr.push(tmp);
        }

        // 建立文件夾與子文件數組的鍵值對
        obj[h3] = arr;

        // 返回該對象
        return obj;
    }
}

json文件

{
    "書籤欄": [
        {
            "name": "GitHub",
            "href": "https://github.com/"
        },
                {
            "name": "RequireJS 中文網",
            "href": "http://www.requirejs.cn/home.html"
        },
        {
            "name": "(2 封私信 / 99+ 條消息) 首頁 - 知乎",
            "href": "https://www.zhihu.com/"
        },
        {
            "name": "慕課網(IMOOC)-國內最大的IT技能學習平臺",
            "href": "http://www.imooc.com/"
        } 
    ]
}
相關文章
相關標籤/搜索