Django 博客生成 Markdown 摘要的几种方式对比
时间:2022-06-20
本文章向大家介绍Django 博客生成 Markdown 摘要的几种方式对比,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在搭建博客中, 自动生成摘要是一个很普遍的需求, 今天讲的生成摘要方式均为抽取式, 并且实质仍是抽取文章前 N 个字, 真正的抽取式通常会使用 TextRank 算法计算文章中的句子权重高的再抽取句子, 更非生成式,生成式摘要需要依靠神经网络的帮助.
方式一: 直接取 Markdown 文字的前100个字(不推荐)
这种简单粗暴的方式很不友好, 如果开头是一张图片或者是链接, 那么用户可能只看到链接, 体验感很差.
方式二: 使用正则去掉Markdown (有门槛)
通过研究 Markdown 语法, 然后用正则表达式去除即可.
注意此处的 re.sub
函数, 其参数展开应该是
re.sub(pattern,repl,string,count=0,flags=0)
也就是说下面代码的含义是: 检测到 article.body
中符合 pattern
规则的字符串, 则用空字符串( ''
代表空字符串) 代替符合规则的字符串.
补充一点正则表达式的知识, 以本文中的正则表达式为例: [(.*?)](.*?)
先匹配一个中括号 []
. 因为 []
中的斜杆会让原本匹配中括号表达式转义为匹配一个中括号.
然后开始匹配 ()
内的子表达式 .*?
点 .
匹配除换行符 n 之外的任何单字符
星号 *
匹配前面的子表达式零次或多次
问号 ?
则表示匹配前面的子表达式一次或零次.
整个表达式的意思就是匹配 Markdown 语法中的链接 []()
括号内的字符为任意长度, 零或一或无限多个非回车的字符均可.
笔者进行了测试, 证明这个表达式是可行的.
import recontent = re.sub(r'[(.*?)](.*?)', '', article.body)pattern = r'[*#>`-]'article.body = re.sub(pattern, '', content)
方式三: 转换为 HTML, 再用过滤器去掉HTML标签 (推荐)
Django 内置了过滤器, 引入后即可清除 HTML 标签(当然, 你也可以用正则表达式过滤)
from django.utils.html import strip_tagsarticle.body = strip_tags(markdown.markdown(article.body))
方式四: 使用 Xpath 的 String()
方法 (推荐)
Xpath 的 string()
方法常可用于爬取网页时提取网页的纯文本, 依据这个思路也可以用来提取 Markdown 文字的纯文本.
from lxml import etreehtml = markdown.markdown(article.body)content = etree.HTML(html)article.body = content.xpath('string()')article.body = markdown.markdown(article.body)
- zepto 基础知识(3)
- 1.[Andriod]之Andriod布局 VS WinPhone布局
- WordPress自定义url 中的“author” 别名
- ASP.NET 4 AppFabric 输出缓存提供程序
- WordPress 中禁止编辑“已发布”的文章
- Windows Server 2008 R2 网络负载平衡 (NLB)资料汇总
- 0.[Andriod]之从零安装配置Android Studio并编写第一个Android App
- WordPress 后台编辑文章页面添加自定义提示文字
- 使用json 和jQuery制作级联dropdownlist
- 在64位Windows 7/2008操作系统上部署32位的Web应用程序错误
- 云计算浪潮
- 2.[Andriod]Andriod Studio结合Visual Studio Emulator for Android调试Android App
- Windows Server AppFabric Caching
- zepto 基础知识(2)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 基于docker快速搭建hbase集群
- 在springboot中对kafka进行读写操作
- [883]python安装包出现Retrying
- 深入理解java虚拟机学习笔记(三)-虚拟机性能监控与故障处理工具
- [884]Elasticsearch可视化工具
- 如何控制nodejs的线程数
- 算法篇:链表之合并有序链表
- 速读原著-UnixLinux基础(六)
- Python GUI编程:Tkinter
- JVM系列之:通过一个例子分析JIT的汇编代码
- 二叉查找树-增删查和针对重复数据处理的 Java 实现
- 手把手教你实现自定义Spring Boot的 Starter
- JVM详解之:本地变量的生命周期
- VBA解析复合文档01——实现的功能
- VBA解压缩ZIP文件09——解压-静态Huffman