本文主要介绍如何利用Python中的MarkItDown库将多种文件高效转换为Markdown文本,以及如何使用Python-Markdown库将Markdown文本转换为HTML(超文本标记语言)文本。

Markdown是一种轻量级的标记语言,用于以简洁易读的方式编写文本内容,同时能够方便地转换为结构化的HTML文本或其他格式,常用于编写文档、博客、论坛帖子等。它与纯文本极为接近,几乎不带任何标记或格式,却仍能有效呈现文档的重要结构。Markdown的详细使用说明可参考:Markdown教程

主流的大型语言模型(LLM),如OpenAI的GPT-4,天生便“精通”Markdown,并且常常在未被提示的情况下将其融入回应之中。此外,Markdown的规范还具有极高的编码效率,可谓一举多得。

因此,学习Markdown语言的使用,并通过Python实现Markdown文本与其他格式文本的相互转换,能够提高文档编写的效率和质量,满足不同场景下的文档处理需求。

1 MarkItDown库

1.1 MarkItDown库介绍

MarkItDown库是一款轻量级的Python版Markdown格式解析与渲染工具,能够将多种文件格式高效转换为Markdown格式,从而满足大语言模型(LLMs)及相关文本分析流程的需求。它专注于以Markdown格式精准保留文档的关键结构与内容,包括标题、列表、表格、链接等元素。虽然其输出结果既美观又易于人类用户阅读,但其核心设计宗旨是为文本分析工具提供支持,因此对于那些需要高保真度转换以供人类阅读的文档,它可能并非最优选择。

目前,MarkItDown库支持以下文件类型的转换:

  • PDF
  • PowerPoint(按从上到下、从左到右的顺序读取内容)
  • Word
  • Excel
  • 图片(支持EXIF元数据提取和光学字符识别OCR)
  • 音频(支持EXIF元数据提取和语音转录)
  • HTML
  • 基于文本的格式(如CSV、JSON、XML)
  • ZIP文件(可遍历文件内的内容进行转换)
  • YouTube网址
  • 以及其他更多类型!

MarkItDown库的官方仓库见:markitdownMarkItDown需要在Python3.10及以上版本运行,MarkItDown库安装代码如下:

pip install 'markitdown[all]~=0.1.0a1'

或者从源代码安装:

git clone git@github.com:microsoft/markitdown.git
cd markitdown
pip install -e packages/markitdown[all]

Markitdown与其他同类型工具库的比较见:Markitdown对比分析

1.2 MarkItDown库使用示例

MarkItDown库将不同文件转换为Markdown格式的方式非常简单。只需初始化工具类,然后调用类对象的convert方法对文件进行转换,并输出Markdown格式字符串即可。

示例 1

以下代码展示了如何生成示例Excel数据,并使用MarkItDown库将其转换为Markdown格式的字符串和文件:

import pandas as pd
import numpy as np # 生成一些示例数据
np.random.seed(0)
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank'],
'Age': [25, 30, 35, 40, 45, 50],
'Gender': ['Female', 'Male', 'Male', 'Male', 'Female', 'Male'],
'Score1': np.random.randint(0, 100, 6),
'Score2': np.random.randint(0, 100, 6)
} # 创建一个基本的DataFrame
df = pd.DataFrame(data) # 添加多级索引
index = pd.MultiIndex.from_product([['Group A', 'Group B'],
['Subgroup 1', 'Subgroup 2', 'Subgroup 3']],
names=['Group', 'Subgroup'])
df.index = index # 计算每行的总分和平均分
df['Total Score'] = df[['Score1', 'Score2']].sum(axis=1)
df['Average Score'] = df[['Score1', 'Score2']].mean(axis=1) # 显示表格
# print(df) # 保存表格为xlsx文件
df.to_excel('test.xlsx') # 将excel转换为markdown文件
from markitdown import MarkItDown # 通过传递enable_plugins=Fals参数,表明在进行转换时不启用插件功能
md = MarkItDown(enable_plugins=False) # 调用md对象的convert方法,将test.xlsx文件进行转换
result = md.convert("test.xlsx")
# text_content为一个字符串
print(result.text_content)
# 返回结果为字典
print(result.__dict__) # 将结果保存为Markdown文件
# 定义要保存的Markdown文件的文件名
output_file = "output.md" # 以写入模式打开文件,如果文件不存在则创建
with open(output_file, 'w', encoding='utf-8') as file:
# 将转换后的文本内容写入文件
file.write(result.text_content)

示例 2

本示例展示了使用MarkItDown库将pdf文件转换为Markdown数据,并开启Azure Document Intelligence功能,也就是利用Microsoft文档智能辅助进行转换。注意,此过程不会转换PDF中的图片。

import random
import string
# pip install fpdf
from fpdf import FPDF
from PIL import Image, ImageDraw, ImageFont # 生成随机文字
def generate_random_text(length):
letters = string.ascii_letters + string.digits + string.punctuation
return ''.join(random.choice(letters) for i in range(length)) # 生成随机图片
def generate_random_image(width, height):
# 创建一个随机颜色的图片
image = Image.new('RGB', (width, height), color=(
random.randint(0, 255),
random.randint(0, 255),
random.randint(0, 255)
))
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
# 在图片上添加随机文字
text = generate_random_text(20)
draw.text((10, 10), text, fill=(255, 255, 255), font=font)
image_path = 'random_image.png'
image.save(image_path)
return image_path # 创建PDF并添加随机图片和文字
def create_pdf():
pdf = FPDF()
pdf.add_page() # 添加随机文字到PDF顶部
top_text = generate_random_text(100)
pdf.set_font("Arial", size=12)
pdf.multi_cell(0, 10, txt=top_text)
# 生成随机图片
image_path = generate_random_image(300, 200)
# 添加图片到PDF
pdf.image(image_path, x=10, y=pdf.get_y(), w=100)
# 移动到图片下方
pdf.ln(210)
# 添加随机文字到PDF底部
bottom_text = generate_random_text(100)
pdf.multi_cell(0, 10, txt=bottom_text) # 保存PDF
pdf.output("test.pdf") # 创建PDF
create_pdf()
from markitdown import MarkItDown
# 将文档转换为markdown
# Azure文档智能:可以使用Microsoft文档智能进行转换
md = MarkItDown(docintel_endpoint="<document_intelligence_endpoint>")
# 不会转换PDF中的图片
result = md.convert("test.pdf")
print(result.text_content)

示例 3

本示例展示了借助MarkItDown库使用大语言模型生成图像描述。在初始化该工具类时,需提供大语言模型客户端(llm_client)和大语言模型名字(llm_model)。

from markitdown import MarkItDown
from openai import OpenAI client = OpenAI()
md = MarkItDown(llm_client=client, llm_model="gpt-4o")
result = md.convert("example.jpg")
print(result.text_content)

2 Python-Markdown库

2.1 Python-Markdown库介绍

若需将Markdown格式转换为HTML或其他格式,可以使用Python中的Python-Markdown库。该库是Markdown格式转换为HTML的纯Python实现,它支持标准的Markdown语法,并提供了许多扩展以增强功能。

Python-Markdown库的官方仓库见:Python-Markdown,Python-Markdown库需要在Python3.7及以上版本运行,Python-Markdown库安装代码如下:

pip install markdown

2.2 Python-Markdown库使用示例

示例 1

本示例展示了如何基于Python-Markdown库将Markdown文本转换为HTML。需注意,Python-Markdown库采用的是原始Markdown语法,即当列表项由多个段落构成时,列表项中每个后续段落都必须以4个空格的缩进起始

import markdown
print(f'Markdown Version: {markdown.__version__}') # 定义Markdown文本
markdown_text = """
# 这是一个markdown标题
这是一段普通文字,后续为列表项需要换行或者4个空格。 - 列表项 1
- 列表项 2 [markdown超链接](https://www.example.com)
""" # 将Markdown文本转换为 HTML
html_text = markdown.markdown(markdown_text) # 打印转换后的HTML文本
print(html_text)

示例 2

本示例展示了基于Python-Markdown库从本地Markdown文件中读取内容,并将其转换为HTM格式:

import markdown

def create_example_markdown(file_path):
example_content = """
# markdown示例标题 这是一个示例的Markdown文件内容。 ## 子标题 下面是一个无序列表: - 列表项 1
- 列表项 2 这里还有一个有序列表: 1. 有序项 1
2. 有序项 2
""" try:
with open(file_path, 'w', encoding='utf-8') as file:
file.write(example_content)
print("示例 Markdown 文件已创建。")
except Exception as e:
print(f"错误: 创建文件时发生未知错误: {e}") def read_markdown_file(file_path):
try:
with open(file_path, 'r', encoding='utf-8') as file:
return file.read()
except FileNotFoundError:
print(f"错误: 文件 {file_path} 未找到。")
return None
except Exception as e:
print(f"错误: 读取文件时发生未知错误: {e}")
return None # 创建本地示例markdown文件
file_path = 'example.md'
create_example_markdown(file_path) markdown_text = read_markdown_file(file_path)
if markdown_text is not None:
html_text = markdown.markdown(markdown_text)
print(html_text)

示例 3

本示例展示了在使用Python-Markdown库将Markdown文本转换为HTML的过程中,如何运用自定义扩展函数来修改生成的HTML格式。例如为标题和列表项添加样式。

from markdown.treeprocessors import Treeprocessor
from markdown.extensions import Extension class MarkdownStyleProcessor(Treeprocessor):
# 遍历html节点设置不同参数
def run(self, tree_root):
for element in tree_root.iter():
if element.tag == "h1":
element.set("class", "custom-h1")
element.set("style", "color: #007BFF; font-size: 2.5em; margin-bottom: 0.5em;")
elif element.tag == "h2":
element.set("class", "custom-h2")
element.set("style", "color: #00FF00; font-size: 1.1em; margin-bottom: 0.3em;") class MarkdownStyleExtension(Extension):
# 该方法用于扩展Markdown对象
def extendMarkdown(self, markdown_obj):
# markdown_style定义处理的名字。10表示表示处理器的优先级,值越大越往后处理
markdown_obj.treeprocessors.register(MarkdownStyleProcessor(markdown_obj), "markdown_style", 10) import markdown try:
with open("example.md", "r", encoding="utf-8") as file:
markdown_content = file.read() # 将Markdown内容转换为HTML,同时使用自定义的扩展
html_result = markdown.markdown(
markdown_content,
extensions=[MarkdownStyleExtension()]
)
print(html_result)
except Exception as e:
print(f"发生错误: {e}")

示例 4

Python-Markdown库集成了若干插件,用以支持不同类型Markdown语法的转换。这些插件的调用可通过转换函数的extensions参数进行设置。以下是可扩展的功能及调用参数:

扩展功能 调用参数 模块路径
额外功能 extra markdown.extensions.extra
缩写 abbr markdown.extensions.abbr
属性列表 attr_list markdown.extensions.attr_list
定义列表 def_list markdown.extensions.def_list
围栏代码块 fenced_code markdown.extensions.fenced_code
脚注 footnotes markdown.extensions.footnotes
HTML中的Markdown md_in_html markdown.extensions.md_in_html
表格 tables markdown.extensions.tables
警告 admonition markdown.extensions.admonition
代码高亮 codehilite markdown.extensions.codehilite
遗留属性 legacy_attrs markdown.extensions.legacy_attrs
遗留强调 legacy_em markdown.extensions.legacy_em
元数据 meta markdown.extensions.meta
新行转断行 nl2br markdown.extensions.nl2br
合理列表 sane_lists markdown.extensions.sane_lists
智能标点 smarty markdown.extensions.smarty
目录 toc markdown.extensions.toc
Wiki链接 wikilinks markdown.extensions.wikilinks

以下代码展示了如何基于Python-Markdown库从文件中读取Markdown内容,并利用该库的扩展功能来增添额外特性,例如脚注、代码块和表格。

示例markdown文件如下:

# 示例

示例代码如下[^1]:

print("Hello World!")

示例表格如下[^2]:

|姓名|年龄|
|:-|-:|
|张三|16|
|李四|23| [^1]: 示例代码
[^2]: 示例表格

转换代码如下:

import markdown

with open("example.md", "r", encoding="utf-8") as fd:
markdown_text = fd.read() # 通过extensions参数设置转换格式
html_output = markdown.markdown(
markdown_text,
extensions=["tables", "footnotes", "fenced_code"]
) print(html_output)

3 参考

[python] 使用Python实现Markdown文档格式转换的更多相关文章

  1. windwos文档格式转换成unix格式

    在工作学习中我们避免不了需要将一些脚本和命令记录在笔记里面,我使用的是有道云笔记,每当我将上次记录在有道云的脚本复制出来进行使用的时候,总会报一些奇怪的错误,要么是包含换行符,要么就是格式不对,但是我 ...

  2. Aspose最新版文档格式转换使用破解

    Aspose简介 Aspose.Total是Aspose公司旗下全套文件格式处理解决方案,提供最完整.最高效的文档处理解决方案集,无需任何其他软件安装和依赖.主要提供.net.java.C++d三个开 ...

  3. Java利用jacob实现文档格式转换

    实现文档格式之间的转换,我使用的是jacob-1.7版本,需要jacob.jar来调用activex控件,本机需安装WPS/office,还需要jacob.jar以及jacob.dll 其中:    ...

  4. python: 用pygments给markdown文档染色

    首先你需要一个markdown解析器 比如有常见的markdown和markdown2,其他的可以参考这个网站的评价 我选择了mistune,自己继承写一个渲染的Renderer mistune的do ...

  5. Python - 文档格式转换(CSV与JSON)

  6. Markdown 文档格式编写语法

    http://www.cnblogs.com/cxf520/p/6179294.html

  7. C#解析Markdown文档,实现替换图片链接操作

    前言 又是好久没写博客了 其实也不是没写,是最近在「做一个博客」,从2月21日开始,大概一个多星期的时间,疯狂刷进度,边写代码边写了一整系列的博客开发笔记,目前为止已经写了16篇了,然后上3月之后工作 ...

  8. 使用Python从Markdown文档中自动生成标题导航

    概述 知识与思路 代码实现 概述 Markdown 很适合于技术写作,因为技术写作并不需要花哨的排版和内容, 只要内容生动而严谨,文笔朴实而优美. 为了编写对读者更友好的文章,有必要生成文章的标题导航 ...

  9. 【技术博客】利用Python将markdown文档转为html文档

    利用Python将markdown文档转为html文档 v1.0 作者:FZK 元素简单的md文件 Python中自带有一个markdown库,你可以直接这样使用 md_file = open(&qu ...

  10. python实现解析markdown文档中的图片,并且保存到本地~

    背景 前阵子简书好像说是凉了,搞得我有点小慌,毕竟我的大部分博客都是放在简书上面的,虽然简书提供了打包导出功能,但是只能导出文字,图片的话还是存在简书服务器上面,再加上我一直想要重新做一个个人博客,于 ...

随机推荐

  1. 使用pytorch从零开始实现一个简单的gpt

    使用pytorch从零开始实现一个简单的gpt 本文由prompt引导ChatGPT生成简易版gpt模型,根据比较关心的问题,使用了以下的prompt进行内容和代码的生成: prompt:->如 ...

  2. Linux环境python3-pip安装指定源地址

    # 新建配置文件 vim ~/.pip/pip.conf # 写入地址 [global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple [i ...

  3. Vue + Axios 请求接口方法与传参详解

    使用Vue的脚手架搭建的前端项目,通常都使用Axios封装的接口请求,项目中引入的方式不做多介绍,本文主要介绍接口调用与不同形式的传参方法. 一.Get请求: Get请求比较简单,通常就是将参数拼接到 ...

  4. ASP.NET Core - 日志记录系统(二)

    本篇接着上一篇 [ASP.NET Core - 日志记录系统(一)] 往下讲,所以目录不是从 1 开始的. 2.4 日志提供程序 2.4.1 内置日志提供程序 ASP.NET Core 包括以下日志记 ...

  5. 2020年最新版区块链面试题2-copy

    1. 问:你认为区块链技术中的区块意味着什么? 区块链由所有金融交易的信息组成.一个块只不过是一个记录列表.当这些列表相互结合时,它们被称为区块链.例如,一个组织有100个分类账簿,其中的组合被称为区 ...

  6. 单点登录-OAuth2

    单点登录的实现原理 单点登录在现在的系统架构中广泛存在,他将多个子系统的认证体系打通,实现了一个入口多处使用,而在架构单点登录时,也会遇到一些小问题,在不同的应用环境中可以采用不同的单点登录实现方案来 ...

  7. MySQL事务ACID-隔离级别-锁介绍

    ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则 ...

  8. RPC框架的实现原理,及RPC架构组件详解

    RPC的由来 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时, ...

  9. KafKa动态分组ID

    背景说明:做这个的原因主要是因为懒,KafKa监听没有独立项目出去,由于KafKa没有组内广播模式,这就造成了一个问题:项目多处启动的时候,就只有一个地方能接收信息.这个时候就要手懂修改分组ID了. ...

  10. linux命令操作android手机

    目的 通过一台linux机器操作android手机做一些常用的操作 复杂的操作都是由简单操作开始的, 可以自行发掘 环境 笔记本: thinkpad t480 操作系统: archlinux adb版 ...