用Python編寫博客導出工具
寫在前面的話
我在 github 上用 octopress 搭建了個人博客,octopress 使用Markdown語法編寫博文。之前我在CSDN博客上也寫過不少的技術博文,都說自己的孩子再丑也是個寶,所以就起了把CSDN博客里面的文章導出到個人博客上的念頭。剛開始想找個工具把CSDN博客導出為xml或文本,然后再把xml或文本轉換為Markdown博文。可惜搜了一下現有博客導出工具,大部分要收費才能將全部博文導出為xml格式,所以就只好發明輪子了:寫個工具將全部博文導出為Markdown博文(也是txt格式的)。
我將詳細介紹這個工具的編寫過程,希望沒有學習過編程的人也能夠學會一些簡單的Python語法來修改這個腳本工具,以滿足他們將其他類型的博客導出為文本格式。這也是我第一次學習和使用Python,所以相信我,你一定也可以將自己的博客導出為想要的文本格式。
本文源代碼在這里:ExportCSDNBlog.py
考慮到大部分非程序員使用Windows系統,下面將介紹在Windows下如何編寫這個工具。
下載工具
在 Windows 下安裝Python開發環境(Linux/Mac下用pip安裝相應包即可,程序員自己解決咯):
Python 2.7.3
請安裝這個版本,更高版本的Python與一些庫不兼容。
下載頁面
下載完畢雙擊可執行文件進行安裝,默認安裝在C:\Python2.7。
six
下載頁面 下載完畢,解壓到Python安裝目錄下,如C:\Python2.7\six-1.8.0目錄下。
BeautifulSoup 4.3.2
下載頁面, 下載完畢,解壓到Python安裝目錄下,如C:\Python2.7\BeautifulSoup目錄下。
html5lib
下載頁面 下載完畢,解壓到Python安裝目錄下,如C:\Python2.7\html5lib-0.999目錄下。
安裝工具
Windows下啟動命令行,依次進入如下目錄,執行setup.py install進行安裝:
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文檔
正則表達式文檔
正則表達式在線測試
用到的Python語法
這個工具只用到了一些基本的Python語法,如果你沒有Python基礎,稍微了解一下如下博文是很有好處的。
- string: 字符串操作,參考python: string的操作函數
- list: 列表操作,參考Python list 操作
- dictionary: 字典操作,參考Python中dict詳解
- datetime: 日期時間,參考python datetime處理時間
編寫博客導出工具
分析
首先來分析這樣一個工具的需求:
導出所有CSDN博客文章為Markdown文本。
這個總需求其實可以分兩步來做:
* 獲得CSDN博客文章
* 將文章轉換為Markdown文本
針對第一步:如何獲取博客文章呢?
打開任何一個CSDN博客,我們都可以看到下方的頁面導航顯示“XXX條數據 共XXX頁 1 2 3 … 尾頁”,我們從這個地方入手考慮。每個頁面上都會顯示屬于該頁的文章標題及文章鏈接,如果我們依次訪問這些頁面鏈接,就能從每個頁面鏈接中找出屬于該頁面的文章標題及文章鏈接。這樣所有的文章標題以及文章鏈接就都獲取到了,有了這些文章鏈接,我們就能獲取對應文章的html內容,然后通過解析這些html頁面來生成相應Markdown文本了。
實現
從上面的分析可以看出,首先我們需要根據首頁獲取所有的頁面鏈接,然后遍歷每一個頁面鏈接來獲取文章鏈接。
- 獲取頁面鏈接的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
|
參數 url = “http://blog.csdn.net/” + username,即你首頁的網址。通過urllib2庫打開這個url發起一個web請求,從response中獲取返回的html頁面內容保存到data中。你可以被注釋的 print data 來查看到底返回了什么內容。
有了html頁面內容,接下來就用BeautifulSoup來解析它。BeautifulSoup極大地減少了我們的工作量。我會詳細在這里介紹它的使用,后面再次出現類似的解析就會從略了。soup.find_all(id=“papelist”) 將會查找html頁面中所有id=“papelist”的tag,然后返回包含這些tag的list。對應 CSDN 博文頁面來說,只有一處地方:
1
2
3
4
5
6
7
8
9
10
11
|
|
好,我們獲得了papelist 的tag對象,通過這個tag對象我們能夠找出尾頁tag a對象,從這個tag a解析出對應的href屬性,獲得尾頁的編號12,然后自己拼出所有page頁面的訪問url來,并保存在pageUrlList中返回。page頁面的訪問url形式示例如下:
> page 1: http://blog.csdn.net/kesalin/article/list/1
- 根據page來獲取文章鏈接的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
|