Python脚本:快速将 Spring 在线官方文档格式化为 Markdown 格式文档

Posted 背风衣人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python脚本:快速将 Spring 在线官方文档格式化为 Markdown 格式文档相关的知识,希望对你有一定的参考价值。

章节目录

脚本涉及知识点

  1. http请求
  2. python xpath 解析 html
  3. 元组
  4. 本地文件打开和写入
  5. 字符串拼接

脚本实验文档地址

Spring for Apache Kafka

python 脚本代码

# Spring 文档 markdown 格式化脚本
from urllib.request import urlopen
from lxml import etree

# 标题
h_tags = ('h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7', 'h8', 'h9', 'h10')
# 代码块
code_tags = ('code',)
# 换行
newline_tags = ('br', 'div')
# 序言
preamble_ids = ('preamble',)
# 链接
link_tags = ('a',)
# 列表
list_tags = ('li',)


def writ_element(element, store):
    # 判断加工
    tail = ''
    if isinstance(element, etree._Element):
        if element.tag in h_tags:
            # 标题转换
            for index in range(int(element.tag[1:])):
                store = store + "#"
            store = store + " "
            tail = '\\n'
        elif element.tag in code_tags:
            # 代码块转换
            data_lang = element.attrib.get('data-lang')
            if data_lang:
                store = store + '```' + data_lang + '\\n'
                tail = '\\n```'
            else:
                store = store + "`"
                tail = "`"
        elif element.attrib.get('id') in preamble_ids:
            # 根据 id 属性值补充 “序” 标题
            store = store + '## 序\\n\\n'
        elif element.attrib.get('class') == 'details':
            # 根据 class 属性值补充换行格式
            store = store + "\\n"
            tail = '\\n'
        elif element.tag in link_tags:
            # 根据 a 标签和其 href 属性值补充链接语法
            if element.attrib.get('href'):
                if element.attrib.get('class') == 'anchor':
                    # 如果是锚点,忽略
                    pass
                else:
                    link_url = element.attrib.get('href')
                    store = store + '['
                    tail = '](' + link_url + ')'
        elif element.tag in list_tags:
            # 根据 li 标签补充列表语法
            store = store + '- '
            tail = '\\n'
        elif element.tag in newline_tags:
            # fix:换行放到最后判断,在错误的优先级里,它可能跳过了你真正想要实现的判断加工程序
            store = store + "\\n\\n"

    # 元素类型
    for sub in element.xpath("node()"):
        # 进入元素
        if isinstance(sub, etree._Element):
            store = writ_element(sub, store)
            # 结果写入
        elif isinstance(sub, etree._ElementUnicodeResult):
            if "\\n" != sub.__str__():
                store = store + sub.__str__()
        else:
            raise Exception("位置元素:" + str(type(element)))
    return store + tail


# 以写模式打开文件
# fix: 缺少 encoding= 参数导致写的时候报错:"UnicodeEncodeError: 'gbk' codec can't encode character '\\xa9' in position 78: illegal multibyte sequence"
with open("../temp/Spring for Apache Kafka.md", 'w', encoding="utf-8") as md_file:
    try:
        # 发起请求,获取html文本
        html_data = urlopen("https://docs.spring.io/spring-kafka/docs/2.8.10/reference/html/")
        html_ele = etree.HTML(html_data.read())

        # 标题和文档说明
        header_ele = html_ele.xpath("/html/body/div[@id='header']")[0]
        header_md = writ_element(header_ele, "")

        # 正文
        content_ele = html_ele.xpath("/html/body/div[@id='content']")[0]
        content_md = writ_element(content_ele, "")

        # 文本合并写入文件
        md_file.write(header_md + content_md)
    finally:
        md_file.close()
        pass

效果展示

原文档

对比格式化后的 markdown 格式文档

以上是关于Python脚本:快速将 Spring 在线官方文档格式化为 Markdown 格式文档的主要内容,如果未能解决你的问题,请参考以下文章

微软:要不将 Python弄成Excel官方脚本语言?

ctf 常用python脚本及在线网站

ctf 常用python脚本及在线网站

spring-boot-plus1.2.0-RELEASE发布-快速打包-极速部署-在线演示

spring-boot-plus1.2.0-RELEASE发布-快速打包-极速部署-在线演示

在 Blender 中运行 python 脚本