专栏首页程序员的碎碎念Django 博客生成 Markdown 摘要的几种方式对比

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)

本文分享自微信公众号 - 程序员的碎碎念(gh_53e607dd4782),作者:FesonX

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 在非admin页面使用 Django Ueditor(二)

    benny
  • Django Ueditor二次展示富文本内容(三)

    因为这次是二次展示,是有文章内容的,所以我们应该把文章内容按照富文本的原样格式放到富文本编辑器中展示出来,我们可以用js来实现:

    benny
  • CentOS上用python3替换python2好不好?

    虽然网上有很多人说不要乱动 CentOS 系统搭配好的 Python 环境,因为有很多系统程序是基于 Python2 的,比如 yum。但仔细想想,那些程序对 ...

    benny
  • python 带参数的装饰器

    from functools import wraps import logging

    用户5760343
  • 小兴逛Google I/O 2017(day1实况)

    陈志兴,Google I/O 2017大会的小时光茶社特派员 ,腾讯SNG增值产品部内容中心Android组leader,主要负责手Q个性化业务、手Q WebV...

    小时光
  • 005.Zabbix-Agent客户端安装

    注意:安装服务之后,可以在管理工具----服务中将Zabbix agent设为开机启动。

    木二
  • CUDA 多进程服务工具MPS为啥这么有用?

    多进程服务(MPS)是CUDA应用程序编程接口(API)的另一种二进制兼容实现。MPS运行时架构被设计成透明地启用协作的多进程CUDA应用程序(通常是MPI作业...

    GPUS Lady
  • 《Monkey Java》课程1.1之JDK环境配置

    安装后,检测环境变量是否配置好: 打开命令行窗口,输入命令java -version回显如下则已配置好:

    GitOPEN
  • SpringBoot的@Value注解设置默认值

    在Spring Boot中,如果使用@Value注解对属性进行赋值,但如果在配置文件或启动参数中未指定对应的参数值,则会抛出异常。异常信息往往是对应注入属性的类...

    用户1161110
  • 在ubuntu多用户中使用磁盘配额

    多用户ubuntu主机,必须设定磁盘配额,否则会被滥用,导致home目录被占满,不得不换磁盘或者扩展大小。

    羽翰尘

扫码关注云+社区

领取腾讯云代金券