语雀批量导出与图片下载

一、简介

在云笔记方面我一般使用wolai语雀,本地笔记用Typora,但是这两个云笔记各有利弊

  • wolai的导出可以随md文件直接生成对应的图片文件夹,而且可以直接批量导出(需要企业版),但是普通账户的图床容量只有200M
  • 语雀个人账户的图床拥有10G容量,但是只支持单个文件导出,而且导出md文档的时候图片使用的还是语雀的图床,断网会导致不可访问,而且不能进行本地离线备份

因此今天这篇文章就记录一下语雀如何进行图片本地化保存以及文档批量备份下载

二、导出文档图片批量替换

在实际的使用中,有几个网站是可以获取到语雀图片的(不用重新上传,自动转存)

  • 微信公众号
  • csdn
  • 掘金
  • 知乎

但是还是需要将语雀图片的后缀给去掉,第一种方法是无需运行脚本,如果Typora支持正则,直接正则匹配#clientId=[a-z0-9-&=%.]*(注意可能会变,自己根据实际情况来进行替换),将这串字符给全部替换为空;

第二种需要进行跑python脚本,然后运行python test.py [源文章] [目标文章](举例:python test.py test.md test2.md)

import re
import requests
import os
import sys

output_content = []

def deal_yuque(origin_md_path, output_md_path):
    with open(origin_md_path, 'r', encoding='utf-8', errors='ignore') as f:
        for line in f.readlines():
            line = re.sub(r'png#(.*)+', 'png)', line)
            image_url = str(re.findall(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+',line))
            output_content.append(line)
    with open(output_md_path, 'w', encoding='utf-8', errors='ignore') as f:
        for _output_content in output_content:
            f.write(str(_output_content))



def main():
    origin_md_path = sys.argv[1]
    output_md_path = sys.argv[2]
    deal_yuque(origin_md_path, output_md_path)


if __name__ == '__main__':
    main()

三、Markdown中的图片转换到本地

参考:https://github.com/u21h2/yuque2md

可以根据自己定制批量化的修改操作,修改原理识别文档的图片地址,并自动下载到本地,最后替换文档中的路径

import re
import requests
import os
import sys


yuque_cdn_domain = 'cdn.nlark.com'
output_content = []
image_file_prefix = 'image-'


# origin_md_path: 输入的markdown文件路径
# output_md_path: 输出的markdown文件路径
# image_dir: 图片存储的目录
# image_url_prefix: 图片链接前缀,空字符串或者路径或者CDN地址
# image_rename_mode: 图片重命名模式,raw: 原始uuid模式,asc: 递增重命名模式
def deal_yuque(origin_md_path, output_md_path, image_dir,image_url_prefix,image_rename_mode):
    idx = 0
    with open(origin_md_path, 'r', encoding='utf-8', errors='ignore') as f:
        for line in f.readlines():
            line = re.sub(r'png#(.*)+', 'png)', line)
            image_url = str(re.findall(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+',line))
            # 如果只下载语雀的图片可以在这里加个判断
            # if yuque_cdn_domain in image_url:
            if ('https://' in image_url) and ('.png' in image_url):
                image_url = image_url.replace('(', '').replace(')', '').replace('[', '').replace(']', '').replace("'", '')
                if '.png' in image_url:
                    suffix = '.png'
                elif '.jpeg' in image_url:
                    suffix = '.jpeg'
                download_image(image_url, image_dir, image_rename_mode, idx, suffix)
                to_replace = '/'.join(image_url.split('/')[:-1])
                new_image_url = image_url.replace(to_replace, 'placeholder')
                if image_rename_mode == 'asc':
                    new_image_url = image_url_prefix + image_file_prefix + str(idx) + suffix
                else:
                    new_image_url = new_image_url.replace('placeholder/',image_url_prefix)
                idx += 1
                line = line.replace(image_url, new_image_url)
            output_content.append(line)
    with open(output_md_path, 'w', encoding='utf-8', errors='ignore') as f:
        for _output_content in output_content:
            f.write(str(_output_content))
    return idx


def download_image(image_url, image_dir, image_name_mode, idx, suffix):
    r = requests.get(image_url, stream=True)
    image_name = image_url.split('/')[-1]
    if image_name_mode == 'asc':
        image_name = image_file_prefix + str(idx) + suffix
    if r.status_code == 200:
        open(image_dir+'/'+image_name, 'wb').write(r.content)
    del r



def mkdir(image_dir):
    image_dir = image_dir.strip()
    image_dir = image_dir.rstrip("\\")
    isExists = os.path.exists(image_dir)
    if isExists:
        print('图片存储目录已存在')
    else:
        os.makedirs(image_dir)
        print('图片存储目录创建成功')
    return image_dir



def main():
    origin_md_path = sys.argv[1]
    output_md_path = sys.argv[2]
    image_dir = sys.argv[3]
    image_url_prefix = sys.argv[4]
    image_rename_mode = sys.argv[5] # raw asc
    mkdir(image_dir)
    cnt = deal_yuque(origin_md_path, output_md_path, image_dir, image_url_prefix, image_rename_mode)
    print('处理完成, 共{}张图片'.format(cnt))



if __name__ == '__main__':
    # origin_md_path = input('原文件路径:') 
    # output_md_path = input('目标输出文件路径:')
    # image_dir = input('图片存储路径:')
    # image_url_prefix = input('文档图片前缀(默认为当前路径):') or ''
    # image_rename_mode = input('图片重命名模式(raw和asc默认为asc):') or 'asc'
    # mkdir(image_dir)
    # cnt = deal_yuque(origin_md_path, output_md_path, image_dir, image_url_prefix, image_rename_mode)
    # print('处理完成, 共{}张图片'.format(cnt))
    main()

四、文档批量下载

参考:https://github.com/dzh929/ExportMD-rectify-pics
https://www.yuque.com/duzh929/blog/ocffqg

改导出方法不仅批量导出md文档,而且图片也以文件夹方式保存在本地

git clone https://github.com/dzh929/ExportMD-rectify-pics.git
cd ExportMD-rectify-pics
pip install -r requirements.txt
python ExportMD.py
# 对于namespace的获取
# 知识库 https://www.yuque.com/YourYuqueUserName 对应的 namespace 为 YourYuqueUserName
# Token需要创建

# 如果发生错误,删除.userinfo后重试
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaEasyExcel是一款基于Java的Excel操作工具,可以方便地实现Excel的读取、写入和导出等功能。下面分别介绍JavaEasyExcel如何实现Excel批量导入数据库和批量导出。 ## Excel批量导入数据库 ### 1. 添加依赖 在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.6</version> </dependency> ``` ### 2. 创建实体类 创建一个实体类,用于保存Excel中的数据。例如,我们要导入一个学生信息表,可以创建一个Student类,包含以下字段: ```java public class Student { private String name; private Integer age; private String gender; private String phone; } ``` ### 3. 创建监听器 创建一个监听器,继承AnalysisEventListener类,并重写invoke方法,用于处理Excel中的每一行数据。例如: ```java public class StudentListener extends AnalysisEventListener<Student> { private List<Student> dataList = new ArrayList<>(); @Override public void invoke(Student student, AnalysisContext analysisContext) { dataList.add(student); // 每隔5条存储一次数据库,实际项目中可以适当调整 if (dataList.size() >= 5) { saveData(); dataList.clear(); } } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { // 所有数据解析完成 saveData(); } private void saveData() { // 将 dataList 存储到数据库中 // ... } } ``` ### 4. 执行导入 调用EasyExcel的read方法,即可实现Excel批量导入数据库。例如: ```java String filePath = "student.xlsx"; ExcelReader excelReader = EasyExcel.read(filePath, Student.class, new StudentListener()).build(); excelReader.read(); excelReader.finish(); ``` ## Excel批量导出 ### 1. 添加依赖 在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.6</version> </dependency> ``` ### 2. 创建数据源 创建一个存储Excel数据的数据源。例如,我们要导出一个学生信息表,可以创建一个List<Student>,包含若干个Student对象。 ### 3. 创建表头 创建一个List<List<String>>,用于存储Excel的表头信息。例如: ```java List<List<String>> headList = new ArrayList<>(); List<String> head0 = new ArrayList<>(); head0.add("姓名"); List<String> head1 = new ArrayList<>(); head1.add("年龄"); List<String> head2 = new ArrayList<>(); head2.add("性别"); List<String> head3 = new ArrayList<>(); head3.add("电话"); headList.add(head0); headList.add(head1); headList.add(head2); headList.add(head3); ``` ### 4. 执行导出 调用EasyExcel的write方法,即可实现Excel批量导出。例如: ```java String filePath = "student.xlsx"; ExcelWriter excelWriter = EasyExcel.write(filePath).head(headList).build(); WriteSheet writeSheet = EasyExcel.writerSheet("学生信息").build(); excelWriter.write(dataList, writeSheet); excelWriter.finish(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值