csdn博客转markdown
创始人
2025-05-30 06:48:23
0

近期完成了csdn上的部分博客转到个人博客上,csdn使用的传统编辑器,个人博客使用的markdown,所以下面分享一下两者之间转化。

1. 安装nodejs和npm,这两步网上教程很多,可以参考下网上

2.安装clean-mark

npm install clean-mark --global

该工具可以将我们的博客做一个初步的转markdown,用法如下

clean-mark "https://blog.csdn.net/yyy/article/details/xxx"

双引号内部为某篇具体需要转换的博文链接,转换成功后在当前目录下会出现xxx.md

3.对md文件做进一步的修正

使用clean-mark工具转换的md目前有两个问题

  1. 图片,使用的图片链接会是csdn服务器上的图片,并带有水印,需要将去除水印的图片下载到本地,并将md文件中的链接替换为本地图片链接
  2. 乱码,在一些未识别编程语言的代码片中,中文会出现乱码,形如变,这是XML字符实体的一种表示形式,&#x表示十六进制
    由于需要修正的md文件很多,一个个处理很不方便,所以将需要转换的博客通过第二步转换后同一在一个目录,然后编写程序,只要扫描到该目录下的md文件,就进行修正
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class CsdnHandle {private final String fileRoot = "H:\\CSDN"; //需修正的md文件夹路径private final String artImgFilePath = "file://D:/Program Files/Gridea/post-images/"; //md文件中本地图片根路径public static void main(String[] args) {CsdnHandle handle = new CsdnHandle();handle.process();}public void process() {String imgRoot = fileRoot+"\\img\\"; //下载的去水印图片String tomd = fileRoot+"\\tomd\\"; //转化完的md文件File file = new File(imgRoot);if (!file.exists()) {file.mkdirs();}file = new File(tomd);if (!file.exists()) {file.mkdirs();}file = new File(fileRoot);File[] fileArray = file.listFiles();for (File file1 : fileArray) {if (!file1.isDirectory()) {//判断文件是否是md文件Integer hz = file1.getAbsolutePath().indexOf(".md");if (hz != -1) {conversionMd(file1,imgRoot,tomd);System.out.println(file1.getName() + " ok");}}}}public void conversionMd(File file,String imgRootPath,String toMdPath) {List allLines = null;try {allLines = Files.readAllLines(Paths.get(file.getAbsolutePath()));} catch (IOException e) {e.printStackTrace();}int head = 0;String title = null;Pattern pattern = Pattern.compile("!\\[]\\(.*?\\)");//匹配链接int imgId = 1;OutputStream out = null;BufferedWriter bw = null;for (String line : allLines) {if(line.equals("---")) {head++;continue;}if(head == 1) {if(line.indexOf("title: ") != -1) {title = line.substring("title: ".length());title = title.replace(" ","之");title = title.replace("-","之");File mdfile = new File(toMdPath+title+".md");try {out=new FileOutputStream(mdfile);bw=new BufferedWriter(new OutputStreamWriter(out,"utf-8"));} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();}}}if(head == 2 && title != null && bw != null) {Matcher matcher = pattern.matcher(line);while (matcher.find()) {String httpLink = matcher.group(0).substring(4,matcher.group(0).length()-1);String path = linkSaveImg(imgId, title,imgRootPath,httpLink);line = line.replace(httpLink, path);imgId++;}try {bw.write(unescape(line));bw.newLine();} catch (IOException e) {e.printStackTrace();}}}try {if(bw != null)bw.close();if(out != null)out.close();} catch (IOException e) {e.printStackTrace();}}//下载图片到本地public String linkSaveImg(int imgId, String title,String filePath,String http) {String sp[] = http.split("\\?");String suffix = sp[0].substring(sp[0].lastIndexOf("."));try {URL url = new URL(sp[0]);HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 设置超时间为3秒conn.setConnectTimeout(3 * 1000);// 防止屏蔽程序抓取而返回403错误conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");// 得到输入流InputStream inputStream = conn.getInputStream();// 获取字节数组byte[] getData = readInputStream(inputStream);// 文件保存位置File file = new File(filePath+title+"_"+imgId+suffix);FileOutputStream fos = new FileOutputStream(file);fos.write(getData);if (fos != null) {fos.close();}if (inputStream != null) {inputStream.close();}} catch (Exception e) {e.printStackTrace();}return artImgFilePath+title+"_"+imgId+suffix;}public byte[] readInputStream(InputStream inputStream) throws IOException {byte[] buffer = new byte[1024];int len = 0;ByteArrayOutputStream bos = new ByteArrayOutputStream();while ((len = inputStream.read(buffer)) != -1) {bos.write(buffer, 0, len);}bos.close();return bos.toByteArray();}//解决乱码问题public static String unescape(String src) {int index = -1;while((index=src.indexOf("&#x")) != -1) {String data = src.substring(index+3,index+7);char ch = (char) Integer.parseInt(data, 16);src = src.replace("&#x"+data+";",""+ch);}return src;}}

使用Java编写这个程序的主要原因是网络相关操作真香!

上面分享的是传统编辑器转markdown,如果本身博文就是使用markdown编写,那么有个可全部打包下载的方案

1.登陆CSDN后,点击链接:https://blog-console-api.csdn.net/

链接打开如示
链接打开会发现是一个404,没错,不用怀疑是操作错了。

2.F12 -> console

在该404界面F12打开 开发者工具,并选择控制台(console)
输入如下代码回车

var s=document.createElement('script');s.type='text/javascript';document.body.appendChild(s);s.src='//cdn.jsdelivr.net/gh/ame-yu/csdn-move@latest/dist/index.js';

在这里插入图片描述

稍等片刻便可打包下载一个zip文件,里面包含所有的md文章,文章数越多,其等待时间越长,可将鼠标放置浏览器标签页查看其打包进度情况。
在这里插入图片描述

相关内容

热门资讯

公务员遴选第一名落榜?重庆通报 重庆市财政局网站 近日,有媒体报道称,重庆33岁男子齐某(化名)参加公务员遴选,笔试和综合成绩均为第...
上市不足600天!极氪正式回归... 本文来源:时代周报 作者:武凯12月22日晚间,吉利汽车控股有限公司(00175.HK,以下简称“吉...
核心项目集体换帅!太古地产半年... 临近年末,太古地产又密集展开人事调动。有媒体报道称,近日,太古地产发布官方任命,委任David Po...
全国城市轨交里程榜:京沪向90... 本文来源:时代周报 作者:李杭作为综合交通体系的重要组成部分,我国轨道交通的建设历来受到关注。今年整...
*ST沐邦被要求退还5.1亿元... 玩具公司豪赌光伏产业,沦为最惨跨界者, 被江西国资接管的*ST沐邦(下称“沐邦高科”)又有了新烦恼。...
石药二代掌舵,锁定创新驱动下的... 石药集团(01093 HK)近期大消息不断,先是创新子公司新诺威向港交所递交招股书,拟冲刺“A+H”...
坐着骆驼送快递,中东“淘金客”... 漫无边际的沙漠中,一队骆驼踩着驼铃声经过,坐在骆驼上的不一定是当地传统的游牧民族,也可能是一个正在赶...
字节跳动,为什么还在大幅涨薪?... 这年头还能大幅涨薪的企业,可以说是极品,尤其是在非常卷的互联网行业。近期有地产媒体观察,在北京海淀区...
实控人被采取刑事强制措施,两家... 财联社、澎湃新闻记者 唐莹莹据财联社报道,交建股份(603815.SH)12月22日晚公告称,公司实...
2025年绿色消费公益研讨会在... 中国商报(记者 于佳鑫)近日,由中国商业联合会与中华环境保护基金会共同主办的“推动绿色消费,推广绿色...