背景
上篇說到我們可以將自己的博客內隨筆/文章/日記備份得到的xml 轉換成CHM文檔,如果我們希望將某個大牛的博客隨筆全部導出,這個能不能實現呢?寫在這里算是廢話了,既然有了這篇博客,那么這個問題,一定是可以解決的。
資源下載
示例文檔截圖(路過秋天):
開發思路
1.根據博客園ID得到隨筆類別,如地址為 http://www.cnblogs.com/cyq1162/,則博客園ID為cyq1162,請求頁面http://www.cnblogs.com/cyq1162/mvc/blog/sidecolumn.aspx。請求結果如下:
通過正則匹配到該頁面的鏈接,以某個鏈接為例,http://www.cnblogs.com/cyq1162/category/268820.html,其中包含cyq1162/category,基於這樣的規則,我們可以得到所有的隨筆分類鏈接。
2.得到隨筆分類鏈接之后,則請求該鏈接的內容,得到該隨筆下的所有文章鏈接。文章鏈接,以某個鏈接為例,http://www.cnblogs.com/cyq1162/archive/2013/03/17/2964746.html,其中包含cyq1162/archive,基於這樣的規則,我們可以得到所有的文章鏈接。
3.得到文章的鏈接,這樣就能得到文章正文。我們要獲取的有文章標題、文章正文、發布時間。這里沒有去嘗試獲取文章作者,不好獲取。前面指的需要獲取的3個內容,在某個明確id的節點里。這里使用了HtmlAgilityPack進行HTML解析,感覺非常方便,可以直接根據ID得到元素,然后獲取它的內容。解析代碼如下:
//下載隨筆內容 替換后保存本地 var contentCode = GetContent(articleUrl);//獲取隨筆內容 HtmlDocument htmlCode = new HtmlDocument(); htmlCode.LoadHtml(contentCode); var titleNode = htmlCode.GetElementbyId("cb_post_title_url"); var postBody = htmlCode.GetElementbyId("cnblogs_post_body"); var postDate = htmlCode.GetElementbyId("post-date"); //var topics = htmlCode.GetElementbyId("topics"); var localHtml = template .Replace("{channelTitle}", titleNode.InnerText)//博文標題 .Replace("{preContent}", DownImage(postBody.InnerHtml))//博文內容 .Replace("{channelHref}", titleNode.GetAttributeValue("href", "#"))//博文地址 .Replace("{channelLink}", userId + ".cnblogs.com")//博客地址 .Replace("{channelAuthor}", userId);//博文作者
4.下一步則是編譯CHM了,這里就不重復介紹了。
其中參考啊漢的博文 《一鍵構造你的博客目錄》 構造了隨筆目錄。
代碼邏輯就這么多,比較簡單,希望大伙喜歡。如果設置首頁不顯示隨筆分類的話,是無法采集的,若是博客引用了自定義樣式,需要手動添加該樣式在。有其他的問題,可以向我反饋,也可以自己下載代碼調試看看。