我在 github 上用 octoPRess 搭建了個(gè)人博客,octopress 使用Markdown語(yǔ)法編寫博文。之前我在CSDN博客上也寫過(guò)不少的技術(shù)博文,都說(shuō)自己的孩子再丑也是個(gè)寶,所以就起了把CSDN博客里面的文章導(dǎo)出到個(gè)人博客上的念頭。剛開始想找個(gè)工具把CSDN博客導(dǎo)出為xml或文本,然后再把xml或文本轉(zhuǎn)換為Markdown博文。可惜搜了一下現(xiàn)有博客導(dǎo)出工具,大部分要收費(fèi)才能將全部博文導(dǎo)出為xml格式,所以就只好發(fā)明輪子了:寫個(gè)工具將全部博文導(dǎo)出為Markdown博文(也是txt格式的)。
我將詳細(xì)介紹這個(gè)工具的編寫過(guò)程,希望沒有學(xué)習(xí)過(guò)編程的人也能夠?qū)W會(huì)一些簡(jiǎn)單的Python語(yǔ)法來(lái)修改這個(gè)腳本工具,以滿足他們將其他類型的博客導(dǎo)出為文本格式。這也是我第一次學(xué)習(xí)和使用Python,所以相信我,你一定也可以將自己的博客導(dǎo)出為想要的文本格式。
本文源代碼在這里:ExportCSDNBlog.py
考慮到大部分非程序員使用Windows系統(tǒng),下面將介紹在Windows下如何編寫這個(gè)工具。
在 Windows 下安裝Python開發(fā)環(huán)境(linux/Mac下用pip安裝相應(yīng)包即可,程序員自己解決咯):
Python 2.7.3
請(qǐng)安裝這個(gè)版本,更高版本的Python與一些庫(kù)不兼容。
下載頁(yè)面
下載完畢雙擊可執(zhí)行文件進(jìn)行安裝,默認(rèn)安裝在C:/Python2.7。
six
下載頁(yè)面 下載完畢,解壓到Python安裝目錄下,如C:/Python2.7/six-1.8.0目錄下。
BeautifulSoup 4.3.2
下載頁(yè)面, 下載完畢,解壓到Python安裝目錄下,如C:/Python2.7/BeautifulSoup目錄下。
html5lib
下載頁(yè)面 下載完畢,解壓到Python安裝目錄下,如C:/Python2.7/html5lib-0.999目錄下。
Windows下啟動(dòng)命令行,依次進(jìn)入如下目錄,執(zhí)行setup.py install進(jìn)行安裝:
C:/Python2.7/six-1.8.0>setup.py install C:/Python2.7/html5lib-0.999>setup.py install C:/Python2.7/BeautifulSoup>setup.py install Python 2.X文檔
BeautifulSoup文檔
正則表達(dá)式文檔
正則表達(dá)式在線測(cè)試
這個(gè)工具只用到了一些基本的Python語(yǔ)法,如果你沒有Python基礎(chǔ),稍微了解一下如下博文是很有好處的。
首先來(lái)分析這樣一個(gè)工具的需求:
導(dǎo)出所有CSDN博客文章為Markdown文本。這個(gè)總需求其實(shí)可以分兩步來(lái)做:
* 獲得CSDN博客文章* 將文章轉(zhuǎn)換為Markdown文本針對(duì)第一步:如何獲取博客文章呢?
打開任何一個(gè)CSDN博客,我們都可以看到下方的頁(yè)面導(dǎo)航顯示“XXX條數(shù)據(jù) 共XXX頁(yè) 1 2 3 … 尾頁(yè)”,我們從這個(gè)地方入手考慮。每個(gè)頁(yè)面上都會(huì)顯示屬于該頁(yè)的文章標(biāo)題及文章鏈接,如果我們依次訪問(wèn)這些頁(yè)面鏈接,就能從每個(gè)頁(yè)面鏈接中找出屬于該頁(yè)面的文章標(biāo)題及文章鏈接。這樣所有的文章標(biāo)題以及文章鏈接就都獲取到了,有了這些文章鏈接,我們就能獲取對(duì)應(yīng)文章的html內(nèi)容,然后通過(guò)解析這些html頁(yè)面來(lái)生成相應(yīng)Markdown文本了。
從上面的分析可以看出,首先我們需要根據(jù)首頁(yè)獲取所有的頁(yè)面鏈接,然后遍歷每一個(gè)頁(yè)面鏈接來(lái)獲取文章鏈接。
123456789101112131415161718192021222324252627282930313233 | |
參數(shù) url = “http://blog.csdn.net/” + username,即你首頁(yè)的網(wǎng)址。通過(guò)urllib2庫(kù)打開這個(gè)url發(fā)起一個(gè)web請(qǐng)求,從response中獲取返回的html頁(yè)面內(nèi)容保存到data中。你可以被注釋的 print data 來(lái)查看到底返回了什么內(nèi)容。
有了html頁(yè)面內(nèi)容,接下來(lái)就用BeautifulSoup來(lái)解析它。BeautifulSoup極大地減少了我們的工作量。我會(huì)詳細(xì)在這里介紹它的使用,后面再次出現(xiàn)類似的解析就會(huì)從略了。soup.find_all(id=“papelist”) 將會(huì)查找html頁(yè)面中所有id=“papelist”的tag,然后返回包含這些tag的list。對(duì)應(yīng) CSDN 博文頁(yè)面來(lái)說(shuō),只有一處地方:
1234567891011 | |
好,我們獲得了papelist 的tag對(duì)象,通過(guò)這個(gè)tag對(duì)象我們能夠找出尾頁(yè)tag a對(duì)象,從這個(gè)tag a解析出對(duì)應(yīng)的href屬性,獲得尾頁(yè)的編號(hào)12,然后自己拼出所有page頁(yè)面的訪問(wèn)url來(lái),并保存在pageUrlList中返回。page頁(yè)面的訪問(wèn)url形式示例如下:
> page 1: http://blog.csdn.net/kesalin/article/list/11234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 | |