Van ♂ Python 用docx、PDF保存爬到的数

这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

0x1、引言

上节《Van♂Python | 某星球的简单爬取》 有读者在后台私聊我说:

爬取结果保存到Markdown中,不方便在手机上看,

离谱,咳咳,说不定自己以后也会用到,意思意思折腾下吧,接着下午摸鱼的时间,利用搜了一波关键字后,看到了两种常规玩法,都来试试,先来折腾下看似简单的库 ↓

pandoc

0x2、pandoc库初体验

支持 超!超!超! 多类型的互相转换,有下面这一大坨:

好的,不用去看具体支持哪些文件格式,你能想到的基本都有,我们这里是想把 Markdown转成PDF

怎么安装的话可以看 INSTALL.md,像笔者中Windows的直接下载压缩包或用choco进行安装都可以,这里采用前者,直接下载 免安装包

接着尝试 配置环境变量,以便到处都可以执行pandoc命令:

解压压缩包 → 进入文件夹 → 选中 pandoc.exe → 按住shift右键 → 复制路径 → 此电脑 → 右键打开属性 → 找到高级系统设置 → 环境变量 → 在系统变量(S)处 → 找到PATH → 编辑 → 新建 → 把刚复制的路径贴到这里:

配置完后,打开cmd,键入:pandoc -v,如果不是输出:pandoc 命令找不到之类的,而出现下面这种的:

说明配置成功,如果确定路径没错,又经过了开机关机等,依旧无效的话,可以跟笔者一样直接把解压后的文件丢到Python的Scripts目录下,通过where命令获取Python的安装目录:

来到下图路径,直接把文件都丢这里就好了

配置完,接着看下怎么用:

比较简单,就是命令行执行下:

1
bash复制代码pandoc -o 待转换文件 转换后的文件

试试直接把txt转成pdf:

需要指定 latex引擎,有下述可选项:

有点麻烦了,有些还要单独下个Latex镜像,4个多G,所以直接还是直接转换成Word文档的格式 → docx了:

1
复制代码pandoc 123.txt -o test.docx

打开看看效果:

还行,接着就是一些遍历文件夹的常规操作了,拼接cmd字符串,利用subprocess执行命令,示例代码如下:

1
2
3
4
5
6
7
8
9
10
python复制代码def md_to_doc(file_path):
cmd = "pandoc {} -o {}"
sep_split = file_path.split(os.path.sep)
# 切换到图片所在目录
os.chdir(output_root_dir)
# 判断文件夹是否存在,不在创建
cp_file_utils.is_dir_existed(os.path.join(doc_save_dir, sep_split[-2]))
doc_file_path = os.path.join(doc_save_dir, '{}{}{}.docx'.format(sep_split[-2], os.path.sep, sep_split[-1][:-4]))
subprocess.call(cmd.format(file_path, doc_file_path), shell=True)
print("生成文件:", doc_file_path)

文件生成完毕了,接着来再写脚本把那么多的Word文档合成一个,需要用到下述库 (直接pip装即可):

1
2
bash复制代码pip install python-docx
pip install docxcompose

接着直接肝代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
python复制代码from docx import Document
from docxcompose.composer import Composer

def compose_docx(docx_list):
# 第一个文件
master = Document(docx_list[0])
master.add_page_break() # 强制新一页
composer = Composer(master)
# 后续文件追加合并
for docx in docx_list[1:]:
print("当前处理文件:", docx)
temp = Document(docx)
temp.add_page_break()
composer.append(temp)
composer.save("result.docx")
print("文件合并完毕...")

运行后等坐等程序跑完即可,因为默认的合并顺序是按照文件名的,而我们创建文件时采用的是时间戳方式,所以不用担心顺序问题。看看合成后的文档,可以:

841mb,2927页,WPS打开当场卡死:

0x3、稍微麻烦点的方案

接着说说第二个方案,就是先将Markdown渲染成HTML,然后再转换成PDF,用到这两个库:

1
2
复制代码pip install markdown
pip install pdfkit

还有:wkhtmltopdf,同样下载压缩包,配置环境变量的方式:

命令行键入:wkhtmltopdf -V 查看配置是否生效~

接着就可以直接搞了,写出下面的测试demo:

1
2
3
4
5
6
python复制代码import pdfkit
from markdown import markdown

def md_to_pdf(file_path):
html = markdown(cp_file_utils.read_file_text_content(file_path), output_format='html')
pdfkit.from_string(html, "out.pdf", options={'encoding': 'utf-8'})

传入md文件路径,如果运行后出现:

Pdfkit OSError: No wkhtmltopdf executable found

就是上面的环境变量没生效,重开一个窗口,或者通过下述代码指定路径亦可:

1
2
3
python复制代码import pdfkit
config = pdfkit.configuration(wkhtmltopdf=r"D:\xxx\bin\wkhtmltopdf.exe")
pdfkit.from_url(html, filename, configuration=config)

接着运行还报下述错误:

就是引用到了外部资源,但是却没找着,可以try-except捕获一波异常:

1
2
3
4
5
6
7
8
9
python复制代码def md_to_pdf(file_path):
html = markdown(cp_file_utils.read_file_text_content(file_path), output_format='html')
try:
pdfkit.from_string(html, "out.pdf", options={'encoding': 'utf-8'})
except IOError as e:
# 直接忽略掉异常
pass
finally:
print("文件生成完毕...")

运行后打开生成的PDF,看看效果:

还行,不过这种默认的渲染, 不支持标注、表格、LaTeX、代码块、流程图、序列图和甘特图 ,需要引入更多的扩展。

示例如下:

1
2
python复制代码# 启用tables扩展
html = markdown(text, output_format='html', extensions=['tables'])

示例如下:

1
2
3
4
5
bash复制代码# 安装数学包
pip install python-markdown-math

# 启用数学包扩展
text = markdown(text, output_format='html', extensions=['mdx_math'])
  • 使用第三方Markdown渲染HTML的工具导出HTML (如作业部落),再转成pdf

示例如下:

1
python复制代码pdfkit.from_file('test.html', 'test.pdf', options={'encoding': 'utf-8'})

更多具体内容可参考:Python将MarkDown转PDF(完美转换HTML,含LaTeX、表格等渲染)

0x4、小结

看着都挺简单的,实际上,有深度定制样式需求的,有得折腾,不过巧了,笔者没有,能看就行,感兴趣的读者可以自行摸索下~

爬取数据保存方式技巧+1,阅读体验也更加了,23333,以上就是本文的全部内容,有问题欢迎评论区指出,感谢~

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%