python实现解析markdown文档中的图片,并且保存到本地~
背景
前阵子简书好像说是凉了,搞得我有点小慌,毕竟我的大部分博客都是放在简书上面的,虽然简书提供了打包导出功能,但是只能导出文字,图片的话还是存在简书服务器上面,再加上我一直想要重新做一个个人博客,于是就有了这篇文章。
思路
首先是要解析markdown文档,然后获取到其中的所有图片,再把图片按md文件分好目录保存。
解析markdown文档
这里我用了misaka模块,据说是python的markdown解析器里性能最好的,不过这个的文档着实是精简,太少内容了,写得不清不楚的,基本功能看来就是把markdown文档解析为html文档,但是好像没有直接操作markdown元素的方法。
没事,我可以像平时写爬虫那样解析html呀,不就曲线救国拿到图片了吗~
这里就用BeautifulSoup啦
下载图片
很简单,就是requests,没啥好说的。
实现
遍历文件
首先要遍历文件夹里面的所有md文档:
def get_files_list(dir):
"""
获取一个目录下所有文件列表,包括子目录
:param dir:
:return:
"""
files_list = []
for root, dirs, files in os.walk(dir, topdown=False):
for file in files:
files_list.append(os.path.join(root, file))
return files_list
解析md文档 获取所有图片
先用misaka把markdown转换成html,然后再拿出所有img。
def get_pics_list(md_content):
"""
获取一个markdown文档里的所有图片链接
:param md_content:
:return:
"""
md_render = misaka.Markdown(misaka.HtmlRenderer())
html = md_render(md_content)
soup = BeautifulSoup(html, features='html.parser')
pics_list = []
for img in soup.find_all('img'):
pics_list.append(img.get('src'))
return pics_list
下载图片
def download_pics(url, file):
img_data = requests.get(url).content
filename = os.path.basename(file)
dirname = os.path.dirname(file)
targer_dir = os.path.join(dirname, f'{filename}.assets')
if not os.path.exists(targer_dir):
os.mkdir(targer_dir)
with open(os.path.join(targer_dir, f'{uuid.uuid4().hex}.jpg'), 'w+') as f:
f.buffer.write(img_data)
完整代码
本项目的完整代码已经上传到GitHub了,地址如下:
https://github.com/Deali-Axy/Markdown-Image-Parser
运行
pip install -r requirements.txt
python spider.py
欢迎与我交流
- 打代码直播间:https://live.bilibili.com/11883038
- 微信公众号:DealiAxy
- 知乎:https://www.zhihu.com/people/dealiaxy
- 博客:https://blog.deali.cn
python实现解析markdown文档中的图片,并且保存到本地~的更多相关文章
- C#解析Markdown文档,实现替换图片链接操作
前言 又是好久没写博客了 其实也不是没写,是最近在「做一个博客」,从2月21日开始,大概一个多星期的时间,疯狂刷进度,边写代码边写了一整系列的博客开发笔记,目前为止已经写了16篇了,然后上3月之后工作 ...
- 01将图片嵌入到Markdown文档中
将图片内嵌入Markdown文档中 将图片嵌入Markdown文档中一直是一个比较麻烦的事情.通常的做法是将图片存入本地某个路径或者网络存储空间,使用URL链接的形式插入图片: ![image][ur ...
- 使用Python从Markdown文档中自动生成标题导航
概述 知识与思路 代码实现 概述 Markdown 很适合于技术写作,因为技术写作并不需要花哨的排版和内容, 只要内容生动而严谨,文笔朴实而优美. 为了编写对读者更友好的文章,有必要生成文章的标题导航 ...
- 如何在Markdown文档中插入空格?
简单说 在 Markdown 文档中,可以直接采用 HTML 标记插入空格(blank space),而且无需任何其他前缀或分隔符.具体如下所示: 插入一个空格 (non-breaking space ...
- C# 提取Word文档中的图片
C# 提取Word文档中的图片 图片和文字是word文档中两种最常见的对象,在微软word中,如果我们想要提取出一个文档内的图片,只需要右击图片选择另存为然后命名保存就可以了,今天这篇文章主要是实现使 ...
- 在LaTeX文档中插入图片的几种常用的方法
LaTeX中一般只直接支持插入eps(Encapsulated PostScript)格式的图形文件, 因此在图片插入latex文档之前应先设法得到图片的eps格式的文件. 在LaTeX文档中插入图片 ...
- php解析word,获得文档中的图片
背景 前段时间在写一个功能:用原生php将获得word中的内容并导入到网站系统中.因为文档中存在公式,图片,表格等,因此写的比较麻烦. 思路 大体思路是先将word中格式为doc的文档转化为docx, ...
- js 加载并解析Markdown文档
网上有很多网站会通过.md文档来做页面内容(比如,阮一峰老师的es6入门blog: http://es6.ruanyifeng.com/),很好奇,这是怎么做的?(至于.md是什么,或许(https: ...
- Python实现读取Excel文档中的配置并下载软件包
问题:现在遇到这样一个问题,服务器存储了很多软件包,这些包输入不同的产品,每个产品都有自己的配置,互相交叉,那么到底某一产品所有配置的软件包下载后,占用多大空间呢? 分析:从这个问题入手,了解到:软件 ...
随机推荐
- 【转】Nginx服务并发过10万的Linux内核优化配置
http://www.linuxidc.com/Linux/2012-11/75151.htm以下Linux 系统内核优化配置均经在线业务系统测试,服务器运行状态良好,用了一些时间整理,现和大家分享一 ...
- php函数(parse_str()
parse_str()函数 把查询字符串解析到变量中 parse_str(string, array); string 规定要解析的字符串 array 存储变量的数组名称 例子: <?php p ...
- 我是如何破解你的WINDOWS密码的 ?(1)
我是如何破解你的WINDOWS密码的 ?(1) 密码可以看作我们主要,甚至某些情况下唯一可用于防范入侵的防线.就算入侵者无法在物理上接触到计算机,对于对外的Web应用,他们依然可以通过远程桌面协议或身 ...
- 施耐德NOE77101后门漏洞分析
固件下载地址: GitHub - ameng929/NOE77101_Firmware 文件目录结构,这里只列出了一些主要的文件信息: ├── bin ├── ftp ├── fw ├── rdt ├ ...
- for循环-嵌套
代码 点击查看[ForNest.java]代码 //package com.d; /** * for循环-嵌套 * @date: 2022.2.24 * 正直角三角形.倒直角三角形.等腰三角形.九九乘 ...
- go 互斥锁实现原理
目录 go 互斥锁的实现 1. mutex的数据结构 1.1 mutex结构体,抢锁解锁原理 1.2 mutex方法 2. 加解锁过程 2.1 简单加锁 2.2 加锁被阻塞 2.3 简单解锁 2.4 ...
- 八大排序算法之直接插入排序(InsertionSort)
常见的排序算法 今天复习[直接插入排序] 核心思想:有序数组中 找位置 -- 给无序数组第一个 找位置 ` public class InsertionSort { // 核心思想:有序数组中 找位置 ...
- NSSCTF-[SWPU 2019]Network
下载附件打开之后发现是和ascii比较像,但是尝试解码发现不是ascii,然后这里问了一下大佬然后又翻了一下自己的笔记,最后发现是TTL,这里直接上脚本, import binascii with o ...
- RENIX 软件如何进行IP地址管理——网络测试仪实操
本文主要介绍了BIGTAO网络测试仪如何通过RENIX软件进行IP地址管理.文章分为五部分内容,第一部分介绍了如何通过机框显示屏查看IP地址,之后几部分分别介绍了机框按钮修改.机框接显示器/键盘修改. ...
- 【C# 练习】通过ZoomGame这个案例加强对 反射 插件 特性的认识
游戏情景设定: 有一个游戏机,里面出现几种动物让儿童选择.选择完动物后,在输入数值让动物叫几次. 动物类型以插件的形势存在,可以外包给其他人开发,并提供了开发接口AnimalTool.SDK.dll. ...