1. 程式人生 > >CSDN的文章轉化為Hexo的markdown格式

CSDN的文章轉化為Hexo的markdown格式

開發環境

  • python3.7

引用的包

import json
import logging
import logging.handlers
import re
import urllib.request
from lxml import etree

實現思路

通過瀏覽器開發模式發現,CSDN的進入編輯器之後會通過連結
https://mp.csdn.net/mdeditor/getArticle?id=xxxx 請求到文章的markdown格式,從這裡入手就可以直接得到想要的markdown文字。
而訪問這個連結則需要登入CSDN之後獲取的cookie,可以直接在連結的header檢視得到。

實現

# 裝載cookie
opener = urllib.request.build_opener()
opener.addheaders = [('Cookie', '')]
urllib.request.install_opener(opener)
html = urllib.request.urlopen('https://mp.csdn.net/mdeditor/getArticle?id=xxxx')).read()
j = json.loads(html)
if not j['status']:
    print('cookie過期')
    print(j)
    return
title = j['data']['title'] markdowncontent = j['data']['markdowncontent'] categories = j['data']['categories'] c_list = categories.split(',') c_str = "" # 新增分類 for i in c_list: c_str += " - [{0}]\n".format(i) tags = j['data']['tags'] # 得到Hexo的所需的markdown格式 string = "---\ntitle: {0}\nid: {4}\ndate: {3}\ntags: [{1}]\ncategories:\n{2}\n\n---\n\n<!--more-->\n\n\n\n"
.format(title, tags, c_str, dic[ 'data'],dic['id']) result = string + markdowncontent file = open(self.output + '{0}.md'.format(title), 'w') file.write(result) file.close() print(self.output + '{0}.md'.format(title) + '新增成功!')

博主用的hexo-next主題由於不支援特殊字元URL轉碼,所以標題如果帶特殊字元會無法訪問,這裡建議可以在title欄位後面新增一個id欄位,存放文章的id,並且修改hexo的_config.yml裡面的permalink為permalink: :year/:month/:day/:id/

新版的CSDN部落格編輯器的markdown語法為CommonMark spec,暫時沒發現使用CSDN的格式之後hexo顯示異常的問題

轉換為Hexo格式實現

 # 最終所有文章id和日期的陣列
 result_list = []

 # 獲得文章連結,由於頁面有一些評論的連結,需要過濾掉
 r_str = '^https\:\/\/blog\.csdn\.net\/{0}\/article\/details\/[0-9]+$'.format(self.user)
 url_re = re.compile(r_str)
 # 替換url得到文章的id
 replace_re = re.compile('^https\:\/\/blog\.csdn\.net\/.+\/article\/details\/')

 j = 1
 # 這裡直接使用迴圈代替頁碼的獲取了,當檢索不到資料的時候跳出迴圈
 while True:
     r = urllib.request.urlopen(self.blog_url + str(j))
     html = etree.HTML(r.read())
     # 獲得所有的連結
     u_list = html.xpath('//*[@id="mainBox"]/main//a[@href]')
     id_list = []
     for uri in u_list:
         ri = url_re.match(uri.attrib['href'])
         if ri is not None:
             # 獲取文章id和日期
             data = uri.getparent().getparent().xpath('div[1]/p[1]/span')[0].text
             id_list.append({'id': replace_re.sub('', uri.attrib['href']), 'data': data})
     # 去掉重複的資料
     temp_list = delete_duplicate(id_list)
     # temp_list = id_list
     if len(temp_list) == 0:
         self.logger.info('結束')
         break
     j += 1
     result_list += temp_list

# 刪除字典陣列重複的元素
def delete_duplicate(li):
    temp_list = list(set([str(i) for i in li]))
    li = [eval(i) for i in temp_list]
    return li