当前位置: 代码网 > it编程>前端脚本>Python > 利用Python实现Markdown文档格式转换详解

利用Python实现Markdown文档格式转换详解

2025年03月25日 Python 我要评论
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]

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参数进行设置。以下是可扩展的功能及调用参数:

扩展功能调用参数模块路径
额外功能extramarkdown.extensions.extra
缩写abbrmarkdown.extensions.abbr
属性列表attr_listmarkdown.extensions.attr_list
定义列表def_listmarkdown.extensions.def_list
围栏代码块fenced_codemarkdown.extensions.fenced_code
脚注footnotesmarkdown.extensions.footnotes
html中的markdownmd_in_htmlmarkdown.extensions.md_in_html
表格tablesmarkdown.extensions.tables
警告admonitionmarkdown.extensions.admonition
代码高亮codehilitemarkdown.extensions.codehilite
遗留属性legacy_attrsmarkdown.extensions.legacy_attrs
遗留强调legacy_emmarkdown.extensions.legacy_em
元数据metamarkdown.extensions.meta
新行转断行nl2brmarkdown.extensions.nl2br
合理列表sane_listsmarkdown.extensions.sane_lists
智能标点smartymarkdown.extensions.smarty
目录tocmarkdown.extensions.toc
wiki链接wikilinksmarkdown.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)

以上就是利用python实现markdown文档格式转换详解的详细内容,更多关于python markdown格式转换的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com