Python入门自学进阶-Web框架——34、富文本编辑器KindEditor、爬虫初步

2023-05-16

KindEditor是一个轻量级的富文本编辑器,应用于浏览器客户端。

一、首先是下载:http://kindeditor.net/down.php,如下图

下载后是

解压缩后:

红框选中的都可以删除到,这些主要是针对不同的语言编写的示例,因为我们要在Python中使用,所以这些都没用,lang目录下是语言支持,plugins是扩展插件,themes是主题样式,即CSS文件,kindeditor-all.js是这个框架的源代码,后跟min的是压缩过的,适合于实际项目,主要是减少文件大小,减少传输量。

在我们的Django项目中的static目录下创建js/kindeditor目录,将上述红框以外的部分拷贝到刚创建的目录下:

二、编写网页,使用kindeditor编辑器,页面editor.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="/static/js/kindeditor/kindeditor-all-min.js"></script>
    <script src="/static/js/kindeditor/lang/zh-CN.js"></script>
    <script src="/static/js/kindeditor/themes/default/default.css"></script>
</head>
<body>
    <div>
        <h1>KindEditor演示</h1>
        <hr/>
        {{ con | safe }}
        <hr/>
        <img src="/static/images/video/p1.png" height="40" width="100%" />
    </div>
    <form method="post">
        <h2>请输入内容:</h2>
        {% csrf_token %}
        <div style="width: 700px;margin: 10px 30px 0 0">
            <textarea name="content" id="editor_id"></textarea>
        </div>
        <input type="submit" value="提交" />
    </form>
<script>
    var options = {
        width:'100%',
        height:'400px',
        uploadJson:'/kind/upload_img/',  // 文件上传处理路径
        extraFileUploadParams:{
            'csrfmiddlewaretoken':'{{ csrf_token }}'
        },
        fileManagerJson:'/kind/file_manager/',
        allowImageUpload:true,
        allowPreviewEmoticons: true,
    }
    KindEditor.ready(function (K) {
        window.editor = K.create("#editor_id",options);
    });

</script>
</body>

</html>

三、编写路由项:

path('editor/',views.editor,name="editor"),

四、编写视图函数views.editor:

def editor(request):
    CONTENT = "默认值"
    if request.method == "POST":
        content = request.POST.get('content')
        CONTENT = content
        print(CONTENT)
    return  render(request,'editor.html',{'con':CONTENT})

添加图片上传处理的路由项,即KE的uploadJson:'/kind/upload_img/'选项定义的路由项/kind/upload_img/

path('kind/upload_img/',views.upload_img,),

五、编写处理函数views.upload_img:

def upload_img(request):
    '''
    文件上传
    :param request:
    :return:
    '''
    import os
    dic = {
        'error':0,
        'url':'/static/images/video/p1.png',
        'message':'错误了。。。'
    }   # 这是返回给前端KE的结果,如果error为0,表示没有错误,然后图片保存的路径就是url的值,否则,上传有错误,返回的是message
    obj = request.FILES.get('imgFile')   # KE默认上传文件的key是imgFile,可以通过KE的初始化参数filePostName参数设定其他名字
    img_path = os.path.join('static/image/',obj.name)
    print(img_path)
    with open(img_path,'wb') as f:
        for chunk in obj.chunks():
            f.write(chunk)
    dic['url'] = '/'+ img_path

    return JsonResponse(dic)

在浏览器中访问,http://127.0.0.1:8000/editor/,结果如下

views.editor获得content内容,就是编辑器的全部内容。将此内容保存在数据库中,然后在显示即可。

在同一页面中的显示:

在上面的使用中,如果编辑器做的不够完善,是很容易引起XSS安全的,如在输入内容中包含恶意的脚本代码(前端也可以过滤一下,但是效果有限)。所以,最好是在后台,即views.editor函数中对content进行过滤,排除这些危险的标签或属性。

这里过滤本质上是对html或xml的分析。

爬虫初步-BeautifulSoup4,BeautifulSoup一个可以从HTML或XML文件中提取数据的Python库,它接收一个HTML或XML字符串,然后进行格式化,之后它能够通过你喜欢的解析器实现文档导航,查找,修改文档中的指定元素,使得操作变得简单。

解释器:

对文档的分析,可以使用Python自己的解析器(html.parser),也可以使用专用的第三方库解析器(如lxml)

这里学习BeautifulSoup4和解析器,主要是为了下一步进行网络爬虫的学习,因为网络爬虫爬到的都是HTML代码,需要从中分析提取数据。

安装: pip3 install beautifulsoup4 pip3 install lxml

解释器:

解析器

使用方法

优势

劣势

Python标准库

BeautifulSoup(markup, "html.parser")

Python的内置标准库执行速度适中文档容错能力强

Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差

lxml HTML 解析器

BeautifulSoup(markup, "lxml")

速度快文档容错能力强

需要安装C语言库

lxml XML 解析器

BeautifulSoup(markup, ["lxml", "xml"])

BeautifulSoup(markup, "xml")

速度快唯一支持XML的解析器

需要安装C语言库

html5lib

BeautifulSoup(markup, "html5lib")

最好的容错性以浏览器的方式解析文档生成HTML5格式的文档

学习测试:

from bs4 import BeautifulSoup
from bs4.element import Tag,NavigableString

html_doc ='''
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="/static/js/kindeditor/kindeditor-all-min.js"></script>
        <script src="/static/js/kindeditor/lang/zh-CN.js"></script>
        <script src="/static/js/kindeditor/themes/default/default.css"></script>
    </head>
    <body>
        <a href="#">ok-=tag-a1</a>
        <div style="color:red;" class='myc'>
            <h1>KindEditor演示</h1>
            <hr/>
            默认值
            <hr/>
        </div>
        <a href="#" class=“a2”>ok-=tag-a2</a>
        <form method="post">
            <h2>请输入内容:</h2>
            <input type="hidden" name="csrfmiddlewaretoken" value="MQj3AaoGY0csIOLSG5kyGTvqWkGpt5PEzs3eL8Zv7hhhjpdC8C0yxZI1PROK4xJI">
            <div style="width: 700px;margin: 10px 30px 0 0">
                <textarea name="content" id="content"></textarea>
            </div>
            <input type="submit" value="提交" />
        </form>
    </body>
</html>
'''

# 使用BeautifulSoup,先生成一个object
soup = BeautifulSoup(html_doc,features="html.parser")

#找到第一个a标签
tag = soup.find(name='a')
print(tag) # 结果: <a href="#">ok-=tag-a1</a>

#循环打印出所有的标签
for tag in soup.html.children:
    print("==>",tag)   # 这里要注意,html标签后的空格,回车换行都算是html标签的一个孩子

注意,打印出的空行,都是对应的小红框。

for tag in soup.html.descendants:
    print("==>",tag)

打印所有的孩子,即子子孙孙都打印出,孩子,孩子的孩子。。。都一一列出,看打印结果,会出现很多重复的内容,看打印的部分内容

标签名字:name

for tag in soup.html.descendants:
    print("==>",tag.name)

标签属性:attrs

for tag in soup.html.descendants:
    print("==>",tag.attrs)

对于一些None的标签,会出现:AttributeError: 'NavigableString' object has no attribute 'attrs'错误,即如果标签没有属性,就会报此错误。

# 标签属性测试,进行判断
from bs4.element import Tag
from bs4.element import NavigableString
for tag in soup.html.descendants:
    if isinstance(tag,Tag):  # 判断是否是标签
        print("==>",tag.name,tag.attrs)  # 打印的标签名字是None,其不是Tag,即不是标签,无属性
 
tag1 = soup.find(name='a')
print(tag1)
del tag1.attrs['href']   # 删除属性
print(tag1)

清空标签内容,clear

tag1 = soup.find(name='a')
print(tag1)
tag1.clear()  # 清空内容
print(tag1)

清空标签,hidden

上面的clear只清空标签内的内容,标签本身还在,hidden则将标签本身清除,而标签内的内容还在。

tag1 = soup.find('div')
print(tag1)
tag1.clear()
print(tag1)
tag1.hidden = True
print(tag1)

对kindeditor编辑器上传的内容进行过滤,使用类实现。使用单例模式

from bs4 import BeautifulSoup
class XSSFilter:  # 单例模式
    __instance = None

    def __init__(self):
        # XSS白名单
        self.valide_tags = {
            "font":['color','size','face','style'],
            "b":[],
            "div":[],
            "span":[],
            "a":['href','target','name'],
            "img":['src','alt','title'],
            "p":['align'],
            "pre": ['class'],
            "hr": ['class'],
            "strong": []
        }

    def __new__(cls, *args, **kwargs):
        '''
        单例模式
        :param cls
        :param args:
        :param kwargs:
        :return:
        '''
        if not cls.__instance:
            obj = object.__new__(cls, *args, **kwargs)
            cls.__instance = obj
        return cls.__instance

    def process(self,content):
        soup = BeautifulSoup(content,'lxml')
        # 遍历所有HTML标签
        for tag in soup.find_all(recursive=True):
            # 判断标签名是否在白名单中
            if tag.name not in self.valide_tags:
                tag.hidden = True  # 不在白名单,标签本身先去掉
                # lxml解析器会将不含html和body的内容增加上这两个标签,所以要去掉,不要造成嵌套
                # html.parser不会自动添加html和body
                if tag.name not in ['html','body']:
                    tag.hidden = True
                    tag.clear()
                continue
            # 当前标签的所有属性白名单,即在白名单中的标签,进行属性处理
            attr_rules = self.valide_tags[tag.name]
            keys = list(tag.attrs.keys())
            for key in keys:
                if key not in attr_rules:
                    del tag[key]

        return soup.decode()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python入门自学进阶-Web框架——34、富文本编辑器KindEditor、爬虫初步 的相关文章

  • 通过xmanager连接linux远程主机桌面

    1 效果图 xff1a 远程linux桌面版主机 xff0c 此处是虚拟机 xff1a 使用xmanager xbrowser 连接后的界面 xff1a 2 使用方法 xff1a linux服务器端配置修改 xff1a a 修改gnome配
  • setTimeout()和setInterval()详解

    JavaScript是单线程语言 xff0c 但是它可以通过设置超时值和间歇时间值来指定代码在特定的时刻执行 超时值是指在指定时间之后执行代码 xff0c 间歇时间值是指每隔指定的时间就执行一次代码 超时调用 超时调用使用window对象的
  • Centos 7.6安装Xfce+VNC Server

    Centos 7 6安装Xfce 43 VNC Server 工作环境安装xface安装 VNC Server在云服务器控制台中设置安全组规则使用VNC Viewer连接云服务器 工作环境 华为云服务器 操作系统 xff1a CentOS
  • C++和C语言的区别是什么?

    首先C 43 43 和C语言本来就是两种不同的编程语言 xff0c 但C 43 43 确实是对C语言的扩充和延伸 xff0c 并且对C语言提供后向兼容的能力 C 43 43 这个词在中国大陆的程序员圈子中通常被读做 C加加 xff0c 而西
  • ubuntu18.0.4安装pip3及虚拟环境virtualenv详细教程

    1 ubuntu安装pip3 该命令是修复安装及补全那些缺少的软件 xff1a sudo apt get f install 安装pip3 xff1a sudo apt get install python3 pip升级pip3 xff1a
  • 什么是子网掩码,如何判断两个IP是不是同一网段

    1 xff1a 什么是子网掩码 xff1f 子网掩码不能单独存在 xff0c 它必须结合IP地址一起使用 子网掩码只有一个作用 xff0c 就是将某个IP地址划分成网络地址和主机地址两部分 说的通俗的话 xff0c 就是用来分割子网和区分那
  • 利用esp-8266实现wifi攻击

    0x00 前言 之前在b站上看到这个wifi模块的攻击视频感觉挺有意思 xff0c 就在某宝上入了一个拿回来玩玩 0x01 外观 转接头需要自己另外买 0x03 编译程序 https anky cc esp8266 deauther wif
  • 如何从 JavaScript 对象中删除属性?

    问题描述 xff1a 给定一个对象 xff1a let myObject span class token operator 61 span span class token punctuation span span class toke
  • 在 Git 中推送提交时消息“src refspec master does not match any”

    问 xff1a 我克隆我的存储库 xff1a git clone ssh span class token operator span span class token operator span span class token oper
  • Qt编译、链接和运行参数的设置

    Qt编译 链接和运行参数的设置 Qt笔记 使用 Qt Creator 集成开发环境构建和运行程序是一件非常简单的事情 xff0c 一个按钮或者一个快捷键搞定全部 xff0c 通过 Qt Creator使用教程 xff08 简明版 xff09
  • 常用Linux命令行技巧

    结果以表格形式输出 column t 比如 xff1b span class token function mount span span class token operator span column t 默认分隔符为空格 xff0c
  • CV往哪卷?李飞飞指出三颗「北极星」:具身智能,视觉推理和场景理解

    点击下方卡片 xff0c 关注 CVer 公众号 AI CV重磅干货 xff0c 第一时间送达 转载自 xff1a 新智元 编辑 xff1a LRS 导读 ImageNet见证了计算机视觉发展的辉煌历程 xff0c 在部分任务性能已超越人类
  • Java异常处理的九个最佳实践

    1 确保在Finally程序块中完成资源释放或者使用Try With语句 比如对于InputStream xff0c 当我们使用完毕 xff0c 我们要确保资源被正确关闭 xff0c 比如下面我们常见的错误用法 xff0c 不要在try模块
  • CodeMirror使用笔记

    最近因工作需要 xff0c 在项目中使用了CodeMirror代码编辑器 xff0c 以下是使用笔记 首先 xff0c 看下最终的效果 引入基本的需要资源 lt script src 61 34 lt 61 request getConte
  • JAVA注解

    Java注解Annotations主要用于为目标程序提供额外补充的说明信息 注解以 64 符号标识注解并不改变编译程序的行为注意可以为程序元素 xff1a 实例变量 构造方法 方法或者类添加元数据信息注解并不是单纯的注释 xff0c 但却可
  • ubuntu中GitLab的安装与配置

    这里 xff0c 我们采用离线安装的方式安装GitLab 首先 xff0c 我们从清华大学开源软件镜像站中下载软件包 xff0c 用户可根据实际的服务器操作系统版本来选择不同的镜像资源 xff0c 这里我们以ubuntu为例 执行命令sud
  • Jenkins使用笔记

    本章简单记录Jenkins的使用笔记 首先 xff0c 我们从官网中下载安装介质 xff0c 可以看到这里有适合各种操作系统版本的安装源介质 xff0c 简单起见 xff0c 我们直接下载一个通用的war程序包 执行命令java jar j
  • GitLab 与 Jenkins 持续集成实践

    首先 xff0c 我们简单说明下我们的部署环境 xff1a GitLab xff1a 192 168 43 61 Jenkins xff1a 192 168 43 116 Jenkins中系统设置中 xff0c 配置GitLab连接信息 x
  • Linux下免密认证登录失败原因总结

    事件背景 A机器已经生产rsa密钥且已经将public key添加到B机器 root ssh authorized keys xff0c 但是从A机器上ssh root 64 B机器时仍然需要输入密码 xff0c 即无密码认证失败 原因总结
  • 公钥添加到authorized_keys到文件中之后仍无法免密登陆

    接上一章 xff0c 关于Linux下免密登陆失败 xff0c 这里找了Stackoverflow上关于这个问题的讨论 xff1a Adding public key to ssh authorized keys does not log

随机推荐

  • Java 8 中的List排序

    按字母顺序排序字符串列表 List lt String gt cities 61 Arrays asList 34 Milan 34 34 london 34 34 San Francisco 34 34 Tokyo 34 34 New D
  • Microservices vs SOA - 微服务与SOA

    开始之前 xff0c 我们先简单看下单体架构 SOA与微服务之间的区别 xff0c 如下图所示 xff1a 简单来讲 xff0c 对于单体架构 xff0c 其就像一个超大容器 xff0c 容器内集中包含了该应用的所有软件组件 xff0c 并
  • Python 机器学习8:sklearn 聚类算法

    1 K Means算法是一种广泛使用的聚类算法 from sklearn cluster import KMeans K Means是聚焦于相似的无监督的算法 xff0c 以距离作为数据对象间相似性度量的标准 xff0c 即数据对象间的距离
  • 什么是微服务——微服务架构体系介绍

    Why Microservices 回答这个问题前 xff0c 我们先看下之前大行其道的单体架构 Monolithic Architecture xff0c 对于非专业人士来讲 xff0c 所谓的单体架构 xff0c 其就像一个超大容器 x
  • 微服务架构特征

    一个典型的微服务架构 xff08 MSA xff09 通常包含以下组件 xff1a 客户端 xff1a 微服务架构着眼于识别各种不同的类型的设备 xff0c 以及在此设备上进行的各种管理操作 xff1a 搜索 构建 配置等等身份标识提供者
  • 微服务架构系列——API服务网关

    本章我们简单介绍微服务架构下的API服务网关 xff0c 本章我们将讨论以下话题 xff1a 什么是API服务网关为什么需要API服务网关API服务网关的工作机制 处理横切关注点 当我们在开发设计大型软件应用时 xff0c 我们一般都会采用
  • Java之keytool命令学习

    Java Keytool is a key and certificate management utility It allows users to manage their own public private key pairs an
  • HashMap 与 HashTable的区别

    HashMap 实现了Map接口非线程同步 xff0c 非线程安全不允许重复键键和值均允许为null HashMap lt Interger String gt employeeHashmap 61 new HashMap lt Integ
  • 如何避免敏捷失败?

    很多人都听说敏捷 xff0c 有些人知道敏捷是什么 xff0c 有些人也尝试过敏捷 xff0c 本章中将列举出一些常见的错误敏捷实践 xff0c 如果想要避免敏捷失败 xff0c 建议还是要对照下你所在的敏捷团队中有没有类似的敏捷实践 xf
  • 一个人有文化,到底有多重要?

    关于什么是文化 xff0c 我最最欣赏的回答 xff0c 是作家梁晓声的四句概括 xff1a 根植于内心的修养 xff0c 无需提醒的自觉 xff0c 以约束为前提的自由 xff0c 为别人着想的善良 01 一位叫做 Judy 的空姐 xf
  • MyBatis动态SQL中Map参数处理

    在MyBatis中 xff0c 如果我们需要传递两个参数 xff0c 有一种方式是通过Map作为传入参数 xff0c 在动态SQL中 xff0c 我们需要对传入的Map参数中的值进行判断 xff0c 然后进行动态SQL的条件拼接处理 假设我
  • MyBatis框架下防止SQL注入

    与传统的ORM框架不同 xff0c MyBatis使用XML描述符将对象映射到SQL语句或者存储过程中 xff0c 这种机制可以让我们更大的灵活度通过SQL来操作数据库对象 xff0c 因此 xff0c 我们必须小心这种便利下SQL注入的可
  • 使用android 视频解码mediaCodec碰到的几个问题

    问题1 mediaCodec dequeueInputBuffer一直返回 1 xff0c APP现象 xff1a 视屏卡屏 原因 xff1a 这是因为inputbuffer的内容有误 xff0c 导致无法解码 可通过设延时时间解决 xff
  • 云计算思维导图

    根据近期的云计算学习心得 xff0c 将云计算部分内容制作成思维导图 xff0c 方便于广大云计算学习者作为辅导讲义 xff01 思维导图内容主要包含 xff1a 1 云计算概述 2 云体系结构 3 网络资源 4 存储资源 5 硬件介绍 6
  • 路由器重温——串行链路链路层协议积累

    对于广域网接口来说 xff0c 主要的不同或者说主要的复杂性在于理解不同接口的物理特性以及链路层协议 xff0c 再上层基本都是 IP 协议 xff0c 基本上都是相同的 WAN口中的serial接口主要使用点对点的链路层协议有 xff0c
  • 路由器重温——PPPoE配置管理-2

    四 配置设备作为PPPoE服务器 路由器的PPPoE服务器功能可以配置在物理以太网接口或 PON 接口上 xff0c 也可配置在由 ADSL 接口生成的虚拟以太网接口上 1 配置虚拟模板接口 虚拟模板接口VT和以太网接口或PON接口绑定后
  • Python入门自学进阶——1--装饰器

    理解装饰器 xff0c 先要理解函数和高阶函数 首先要明白 xff0c 函数名就是一个变量 xff0c 如下图 xff0c 定义一个变量名和定义一个函数 xff0c 函数名与变量名是等价的 既然函数名就是一个变量名 xff0c 那么在定义函
  • Python入门自学进阶-Web框架——21、DjangoAdmin项目应用

    客户关系管理 以admin项目为基础 xff0c 扩展自己的项目 一 创建项目 二 配置数据库 xff0c 使用mysql数据库 xff1a 需要安全mysqlclient模块 xff1a pip install mysqlclient D
  • Python入门自学进阶-Web框架——33、瀑布流布局与组合查询

    一 瀑布流 xff0c 是指页面布局中 xff0c 在显示很多图片时 xff0c 图片及文字大小不相同 xff0c 导致页面排版不美观 如上图 xff0c 右边的布局 xff0c 因为第一行第一张图片过长 xff0c 第二行的第一张被挤到第
  • Python入门自学进阶-Web框架——34、富文本编辑器KindEditor、爬虫初步

    KindEditor 是一个轻量级的富文本编辑器 xff0c 应用于浏览器客户端 一 首先是下载 xff1a http kindeditor net down php xff0c 如下图 下载后是 解压缩后 xff1a 红框选中的都可以删除