python解析markdown

news2024/10/7 2:20:52

python解析markdown

  • 1、安装markdown模块
  • 2、python解析markdown
    • 2.1 QtWebEngineWidgets显示网页
      • 2.1.1 网页加载
      • 2.1.2 网页加载错误
    • 2.2 Python-Markdown 模块库
    • 2.3 QTextDocument、QTextBrowser、QTextEdit
  • 3、案例Demo
    • 3.1 先上图
    • 3.2 代码文件

1、安装markdown模块

pip install markdown

在这里插入图片描述

2、python解析markdown

参考 6.5. Python之markdown模块

2.1 QtWebEngineWidgets显示网页

2.1.1 网页加载

QWebEngineView#load(url)
QWebEngineView#setHtml(url)

# !/usr/bin/python3
# -*- coding: utf-8 -*-

from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QMainWindow, QApplication, QTabWidget
import sys


class UIDemo(QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setWindowTitle('WebView')
        self.resize(800, 500)
        # 添加标签栏
        self.tabs = QTabWidget()
        self.tabs.setDocumentMode(True)

        self.add_new_tab(QUrl('http://www.baidu.com'), 'Homepage')
        self.setCentralWidget(self.tabs)

    # 添加新的标签页
    def add_new_tab(self, qurl=QUrl(''), label='Blank'):
        # 设置浏览器
        self.browser = QWebEngineView(self)
        # 加载cookie

        self.browser.page().load(qurl)
        self.browser.setToolTip("xhbrue")
        # 添加标签
        i = self.tabs.addTab(self.browser, label)
        self.tabs.setCurrentIndex(i)
        # 将标签标题改为网页相关的标题
        self.browser.loadFinished.connect(
            lambda _, i=i, browser=self.browser: self.tabs.setTabText(i, self.browser.page().title()))


if __name__ == '__main__':
    app = QApplication(sys.argv + ["--no-sandbox"])  # 若加载网页空白,添加 "--no-sandbox"
    demo = UIDemo()
    demo.showMaximized()
    app.exec_()

2.1.2 网页加载错误

    1. 未安装报错
      在这里插入图片描述

单独安装WebEngine:

pip install PyQtWebEngine

或指定下载源

pip install PyQtWebEngine -i http://pypi.douban.com/simple --trusted-host=pypi.douban.com
    1. 加载网页空白
      参考 pyqt5+QWebEngine窗口图形无法显示解决方案

我的问题解决方法:声明窗口程序时,输入参数添加"--no-sandbox",例如:
app = QApplication(sys.argv+["--no-sandbox"])

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv + ["--no-sandbox"])
    htmlview = QWebEngineView()
    url = QUrl(r"https://www.baidu.com/")
    htmlview.load(url)
    htmlview.show()
    sys.exit(app.exec_())

在这里插入图片描述

2.2 Python-Markdown 模块库

pip install markdown

将markdown转换成html markdown.markdown(text)

Python-Markdown是John Gruber的Markdown语法的python实现。但是与一般Markdown还是有些许差别。这些差别包括:

  • Python-Markdown默认忽略掉单词中间的加重标识(middle-word emphasis)。如some_long_filename.txt不会被转译成somelongfilename.txt

  • Markdown语法规则中指出如果一个列表组件包含多个段落,那么后面的段落必须空出4个空格或者一个tab。与其他语法解释器不同,Python-Markdown严格遵守这条规定,并且所有在列表中的块一级元素都如此规定。

  • 当列表的一行遇到其他列表标识(如星号,数字等),官方规则没有指明是否需要另起一行。为了一致性,Python-Markdown也不做修改。但是Sane List 这个扩展模块提供了更友好的解决方式。

另外,Python-Markdown还提供的弹性的扩展机制。

2.3 QTextDocument、QTextBrowser、QTextEdit

QTextDocument.setMarkdown(markdown[,features=QTextDocument.MarkdownDialectGitHub])

使用支持的给定功能,用markdown字符串中给定的Markdown格式的文本替换文档的全部内容。默认情况下,包括所有受支持的GitHub样式的Markdown功能;通过MarkdownDialectCommonMark进行更基本的解析。Markdown格式应尽可能地受到尊重;例如,'* bold * text'会生成文本,其中第一个单词的字体粗细会使其外观更加突出。markdown字符串中包含的HTML解析setHtml中的处理方式相同;但是,不支持HTML块内的Markdown格式化。可以通过features参数启用或禁用解析器的某些功能:默认为MarkdownDialectGitHub。调用此函数时,将重置撤消/重做历史记录。

QTextBrowser(QTextEdit).setMarkdown(markdown)

QTextEdit.setMarkdown(markdown)

此属性为文本edit的文本提供Markdown接口。toMarkdown()纯文本Markdown返回文本编辑的文本,而没有任何嵌入式HTML格式。QTextDocument支持的某些功能(例如使用特定的颜色和命名的字体)无法用“纯” Markdown表示,因此将被忽略。setMarkdown()会更改文本编辑的文本。删除所有先前的文本,并清除撤消/重做历史记录。输入的文本被解释为Markdown格式的富文本。markdown字符串中包含的HTML的解析setHtml中的处理方式相同;但是,不支持HTML块内的Markdown格式。可以通过features参数启用或禁用解析器的某些功能:默认值为MarkdownDialectGitHub

3、案例Demo

3.1 先上图

在这里插入图片描述

3.2 代码文件

文件app.py

# !/usr/bin/python3
# -*- coding: utf-8 -*-
import os

import markdown
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtGui import QIcon
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtWidgets import QDesktopWidget, QMessageBox, QMainWindow, QFileSystemModel, QHBoxLayout, \
    QTreeView, QWidget, QAction, QFileDialog


class Ui_MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.show()

    def initUI(self):
        _translate = QtCore.QCoreApplication.translate
        self.setWindowTitle(_translate("XhNote", "Xh笔记"))
        # self.setWindowTitle("XhNote")
        icon = QIcon("icon.ico")
        self.setWindowIcon(icon)
        self.resize(800, 600)
        self.menuBarUI()
        self.statusBarUI()
        self.centralwidgetUI()
        # self.center()
        QtCore.QMetaObject.connectSlotsByName(self)

    def menuBarUI(self):
        menubar = self.menuBar()
        menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
        menubar.setObjectName("menubar")

        openAct = QAction(menubar)
        openAct.setCheckable(False)
        openAct.setObjectName('openFileAction')
        openAct.triggered.connect(self.opendir)
        openAct.setText('打开')

        menu_2 = QtWidgets.QMenu(menubar)
        menu_2.setObjectName("menu_2")
        # self.setMenuBar(menubar)

        # self.setStatusBar(statusbar)
        menubar.addAction(openAct)
        menubar.addAction(menu_2.menuAction())
        _translate = QtCore.QCoreApplication.translate
        # openmenu.setTitle(_translate("open", "打开"))
        menu_2.setTitle(_translate("new", "新建"))

    def statusBarUI(self):
        statusbar = self.statusBar()
        statusbar.setObjectName("statusbar")
        statusbar.showMessage('Ready')

    def centralwidgetUI(self):
        mainWidget = QWidget()
        hbox = QHBoxLayout(mainWidget)
        self.treeView = QTreeView()
        self.treeView.setFixedWidth(200)
        self.htmlview = QWebEngineView()
        hbox.addWidget(self.treeView)
        hbox.addWidget(self.htmlview)
        # mainWidget.addWidget(hbox)

        # 建立文件模型
        self.fileModel = QFileSystemModel()
        # 设置模型根目录
        pathIndex = self.fileModel.setRootPath(
            os.path.abspath(r"E:\Books\Python\PyQt5&PyQt6中文手册\PyQt-Chinese-tutorial-master\translated\pyqt5"))
        print(self.fileModel.rootPath())
        # 绑定视图与模型
        self.treeView.setModel(self.fileModel)
        self.treeView.setRootIndex(pathIndex)  # 视图根目录文件模型根目录要一致
        for i in [1, 2, 3]:  # 这里隐藏了文件的信息展示
            self.treeView.setColumnHidden(i, True)
        self.treeView.clicked.connect(self.loadDoc)  # 建立左侧树视图与右侧文本查看器的连接

        self.setCentralWidget(mainWidget)

    # QWebEngineView 加载 Html
    def loadDoc(self, pathIndex):
        filepath = self.fileModel.filePath(pathIndex)
        print(f"选择了文件【{filepath}】")
        if os.path.isfile(filepath):
            self.htmlview.setHtml(self.txt2html(filepath))
        self.statusBar().showMessage(filepath)

    @staticmethod
    def txt2html(filepath):
        with open(filepath, mode="r", encoding='utf-8') as f:
            result = f.read()
        return markdown.markdown(result)

    # QWebEngineView 加载 Html
    def opendir(self):
        dir = QFileDialog.getExistingDirectory(self, r"Open Directory",
                                               "./",
                                               QFileDialog.ShowDirsOnly
                                               | QFileDialog.DontResolveSymlinks)
        print(str(dir))
        pathIndex = self.fileModel.setRootPath(dir)
        self.treeView.setModel(self.fileModel)
        self.treeView.setRootIndex(pathIndex)

    def closeEvent(self, event):
        reply = QMessageBox.question(self, 'Message',
                                     "Are you sure to quit?", QMessageBox.Yes |
                                     QMessageBox.No, QMessageBox.No)
        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

文件xhnote.py

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys

from PyQt5.QtWidgets import QApplication

from app import Ui_MainWindow

if __name__ == '__main__':
    app = QApplication(sys.argv + ["--no-sandbox"])
    # app = QtWidgets.QApplication(sys.argv)
    ui = Ui_MainWindow()
    sys.exit(app.exec_())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/782839.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ElasticSearch学习--操作

目录 索引库操作 mapping映射 总结 创建索引库 查询删除修改索引库 总结 文档操作 添加 查询,删除 修改文档 总结 RestClient操作索引库 初始化JavaRestClient 创建索引库​编辑 删除索引库,判断索引库是否存在 总结 操作文档 新增文档 查询文…

JAVA SE -- 第九天

(全部来自“韩顺平教育”) 一、类变量个类方法 (一)类变量 1、基本介绍 类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值&#…

2023年的深度学习入门指南(18) - 将LLaMA2跑起来

2023年的深度学习入门指南(18) - 将LLaMA2跑起来 之前我们说到过,在GPT 3之后,大模型就很少有开源的了。其中,最为典型的开源支持者就是Meta公司的研究团队。年初他们发布的LLaMA基本上是各家开源模型的主要参考对象。不过,LLaMA…

Python 算法基础篇之集合和字典:创建、访问、添加和删除元素

Python 算法基础篇之集合和字典:创建、访问、添加和删除元素 引言 1. 集合的概念和创建2. 集合的访问3. 集合的添加和删除元素 a ) 添加元素 b ) 删除元素 4. 字典的概念和创建5. 字典的访问6. 字典的添加和删除元素 a ) 添加元素 b ) 删除元素 总结 引言 集合和字…

SAP从放弃到入门系列之批次派生-Batch Derivation-Part2

文章目录 一、派生的类型1.1 静态派生1.2 动态派生 二、派生的方向 通过批次派生的基本配置和简单功能的介绍,大家应该对批次派生有一个基本的了解,这篇文章从批次派生的类型和批次派生的方向两个维度更深入的聊一下它的功能。 一、派生的类型 派生的类…

OPTEE之sonarlint静态代码分析实战一——optee_os

ATF(TF-A)/OPTEE之静态代码分析汇总 一、OPTEE源码下载及分析 对OPTEE实施soanrlint静态代码扫描之前,先到官方网站下载源码。官方网站位于github,网址OP-TEE GitHub。 其中我们重点关注optee_os和optee_client。此页面下的optee_linuxdriver已废弃,该部分最终会编…

数据结构:二叉树遍历

概述 二叉树的遍历是指按照某条搜索路径访问二叉树中的每个结点,使得每个结点均被访问一次,而且仅被访问一次。二叉树的遍历方式主要有:先序遍历、中序遍历、后序遍历、层次遍历。先序、中序、后序其实值得是父节点被访问的次序。若在遍历过…

一.MySQL的主从复制

目录 一.MySQL的主从复制 1.2主从复制的工作过程和原理 1.2.1主从复制工作过程为两日志和三线程 ​编辑 1.2.2主从复制的工作原理 1.3主从复制延迟的原因 1.4主从复制的架构 1.5.MySQL四种同步方式 1.5.1异步复制(Async Replication) 1.5.2 同步复制(Sync Re…

Linux内核子系统--进程管理剖析

Linux 是一个计算需求不断变化的非常动态的系统。 Linux 计算需求的表示以进程的公共抽象为中心,进程可以是短期的(从命令行执行的命令)或长期的(网络服务)。因此,进程的总体管理及其调度非常重要。 在用户…

EMC学习笔记(十八)滤波器设计

滤波器设计 1.标准要求2.设计理论2.1 滤波器电路设计过程2.2 插入损耗定义2.3 原始噪声测量2.4 插入损耗计算2.5 滤波失配原则2.6 滤波拓扑选择2.7 滤波参数计算2.8 滤波参数确定 Tips:学习资料来自网络,仅供学习使用。 EMI滤波器设计(汽车电…

JVM系列(9)——调优初体验

学习这篇文章之前,要了解: JVM系列(2)——垃圾回收 JVM系列(3)——内存分配与回收策略 先了解概念: 吞吐量:用户执行时间/(用户执行时间垃圾回收时间);就是干正经事的时间…

C++语法(25)--- 异常与智能指针

C语法(24) C11_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131054426?spm1001.2014.3001.5501 1.异常 try { // 保护的标识代码 }catch( ExceptionName e1 ) { // catch 块 }catch( ExceptionName e2 ) { // catch 块…

RT-Thread qemu mps2-an385 bsp 移植制作 :BSP 制作篇

下载 V2M-MPS2_CMx_BSP mps2 的资料很少,所以唯一能下载的是 ARM 官方的 V2M-MPS2_CMx_BSP,下载地址为: https://keilpack.azureedge.net/pack/Keil.V2M-MPS2_CMx_BSP.1.8.0.pack 其实这是个 Keil MDK5 的 Pack 包,安装后&#x…

JAVA-ReentrantLock(五)

概念 在Java中,“lock”(锁)是一种用于并发控制的机制。它用于确保在多线程环境中,同一时刻只有一个线程可以访问共享资源或临界区。当一个线程获得了锁,其他线程将被阻塞,直到持有锁的线程释放它。这样可…

Cocos Creator 3.8 后期效果 Shader 编写(1/2) 基础篇

原文链接:Cocos Creator 3.8 后期效果 Shader 编写(1/2) 基础篇 在 Cocos Creator 3.8 版本中,新增了不少实用的特性,其中我最喜欢的,就是它自带后期效果管线,并且还内置了许多高级效果。 有用…

XUbuntu22.04之Linux剪切板和selection primary区域(一百八十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

二、Java框架基础02 XML

二、XML 2.1 XML 简介 XML 即可扩展标记语言,一种简单的数据存储语言,使用一系列简单的标记来描述结构化数据 XML 的特点 XML 与操作系统,编程语言的开发平台无关规范统一,实现不同系统之间的数据交互 2.1.1 XML 的文档结构 以下…

vulnhub靶场之CengBox3

1.信息收集 输入命令:netdiscover -i eth0 -r 192.168.239.0 ,发现181机器存活 输入命令nmap -p- -sV -O -Pn -A 192.168.239.181 ,进行端口探测,发现存在22、80、443端口,还发现存在域名ceng-company.vm。 将域名c…

【linux基础】05-linux文件系统

概述 在Linux中,文件系统是一种分层结构,它将文件和目录组织成树状结构。文件系统从“根”目录开始,该目录由单个正斜杠(“/”)表示。 如下图所示: Linux 支持多种类型的文件系统,包括: Ext4:这是大多数 Linux 发行版的默认文件系统。它是一个日志文件系统,提供良…

拉格朗日乘数法(Lagrange)的推导

同济版高数上,关于拉格朗日乘数法,以及好多知识点说的语焉不详、模棱两可,在阅读了知乎等博主的几篇文章后,才算勉强弄懂了该知识的原理。 首先说一下高数上隐函数求导。所谓的隐函数求导,就是在方程中多个变量之间的…