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

news2024/11/15 17:31:26

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()

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

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

相关文章

一文教会你如何简单使用Fegin进行远程服务调用

文章目录1、fegin的基本介绍2、fegin的基本使用步骤3、项目中的实际运用4、测试前言在分布式微服务中&#xff0c;少不了会进行不同服务之间的相互调用&#xff0c;比如A服务要调用B服务中的接口&#xff0c;如何简单方便的实现呢&#xff1f;fegin可以来帮助。 1、fegin的基本…

如何禁止删除或修改RAR压缩包里的文件?很多人不知道这个功能

你是否有过这样的需求&#xff1f;把文件压缩成RAR格式后&#xff0c;需要对压缩包里的文件进行保护&#xff0c;以防别人或者自己误删文件&#xff0c;或者不小心修改了文件内容。 有些小伙伴可能会给压缩包里的文件都设置上“限制编辑”&#xff0c;这虽然也能防止随意更改内…

Stable Diffusion 个人推荐的各种模型及设置参数、扩展应用等合集(不断更新中)

一、说明 | 表示或者 表示 以上 二、模型 适用风景、房子、车子等漫画类风格 模型的VAE不要用模型附带的&#xff0c;好像就是naifu的官方vae&#xff0c;很老了&#xff0c;用 vae-ft-mse-840000-ema-pruned.ckpt 或者是 kl-f8-anime2.ckpt&#xff1b; 嵌入模型要下载作者…

免费集装箱箱号识别API,人工智能企业CIMCAI集装箱识别检测人工智能平台全球4千企业用户,支持API集成二次开发人工智能企业

免费集装箱箱号识别API&#xff0c;人工智能企业CIMCAI集装箱识别检测人工智能平台全球4千企业用户&#xff0c;支持API集成二次开发。箱信息识别及铅封号识别功能免费&#xff0c;顶尖AI集装箱识别率99.98%&#xff0c;全球No.1集装箱人工智能企业CIMCAI打造。中国上海人工智能…

chrome如何查看和修改除了密码,付款方式,地址意外的自动填充表单内容

这种自动填写的内容似乎无法设置。 软件地址&#xff1a;https://sqlitebrowser.org/dl/ 去这里查看地址 https://chromium.googlesource.com/chromium/src//master/docs/user_data_dir.md 比如我是windows&#xff0c;则地址为&#xff1a;C:\Users\用户名\AppData\Local\Go…

【Java】SpringBoot中实现异步编程

前言 首先我们来看看在Spring中为什么要使用异步编程&#xff0c;它能解决什么问题&#xff1f; 什么是异步&#xff1f; 首先我们先来看看一个同步的用户注册例子&#xff0c;流程如下&#xff1a; 异步的方式如下&#xff1a; 在用户注册后将成功结果返回&#xff0c;…

java:UUID和雪花生成算法

目录 UUID生成不重复命名方法 在实际项目中的运用 UUID算法的缺点 什么是雪花算法&#xff1f; UUID生成不重复命名方法 我们在做项目的时候可能需要用到全局唯一ID的场景&#xff0c;这种时候为了防止ID冲突可以使用36位的UUID UUID可以自动生成唯一的id。是java.util中自…

面朝大海,春暖花开丨2023年Kaadas凯迪仕全国经销商大会成功召开

3月8日&#xff0c;We——2023年Kaadas凯迪仕全国经销商大会将在中国青岛星光岛会议中心隆重举行&#xff0c;盛会汇聚了超过1000名优秀合作伙伴&#xff0c;规模空前。Kaadas凯迪仕品牌创始人&集团总裁苏志勇先生、集团董事长苏祺云先生以及各高层领导均莅临现场。 大会伊…

万字长文:Stable Diffusion 保姆级教程

万字长文&#xff1a;Stable Diffusion 保姆级教程 2022年绝对是人工智能爆发的元年&#xff0c;前有 stability.ai 开源 Stable Diffusion 模型&#xff0c;后有 Open AI 发布 ChatGPT&#xff0c;二者都是里程碑式的节点事件&#xff0c;其重要性不亚于当年苹果发布iPhone&a…

蓝库云|告诉你传统产业该如何进行数字化转型

在后疫情时代下&#xff0c;企业该如何在面临生存危机的情形下&#xff0c;投入「数字化转型」、提升公司竞争力&#xff0c;已成为许多公司的当务之急&#xff0c;但到底什么是数字化转型呢&#xff1f;传统产业又如何着手进行数位转型&#xff1f; 数字化转型是什么&#xf…

Uipath Excel 自动化系列13-ForEachExcelSheet(遍历Sheet)

活动描述 ForEachExcelSheet(遍历Sheet)&#xff1a;遍历Excel中的工作表&#xff0c;可以对 Excel 工作簿中的每个工作表重复一个或多个活动,该活动需与Use Excel File 活动选择的 Excel 文件一起使用。 使用场景&#xff1a;当处理包含多张工作表的 Excel 文件&#xff0c;…

项目管理工具DHTMLX Gantt灯箱元素配置教程:如何验证

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求&#xff0c;具备完善的甘特图图表库&#xff0c;功能强大&#xff0c;价格便宜&#xff0c;提供丰富而灵活的JavaScript API接口&#xff0c;与各种服务器端技术&am…

【FPGA】Verilog:时序电路设计 | 二进制计数器 | 计数器 | 分频器 | 时序约束

前言&#xff1a;本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例&#xff1a;计数器与分频器 ​​ 功能特性&#xff1a; 采用 Xilinx Artix-7 XC7A35T芯片 配置方式&#xff1a;USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度 存储器&#…

做自媒体真的能赚到钱吗?真的能赚到几十万吗?

自媒体在当今社会已经成为一个热门话题&#xff0c;越来越多的人开始尝试做自媒体&#xff0c;希望能够通过自媒体赚到钱。但是&#xff0c;做自媒体真的能赚到钱吗&#xff1f;能赚到几十万吗&#xff1f;下面我们来一一解答。 首先&#xff0c;做自媒体确实可以赚到钱。随着互…

硬件语言 Verilog HDL 学习 day02 数据流建模,行为级建模,结构化建模

1.数据流建模 1.含义&#xff1a;在电路规校较小的清况下&#xff0c;由于包含的门数比较少&#xff0c;设计者可以逐个地引用逻辑门实例把它 们互相连接起来&#xff0c; 因此使用门级建换进行设计是很合适的。对于具有数字逻辑电路设计基本知识的用户来讲&#xff0c;门级建模…

Java性能调优杀手锏JMH

JMH简介 JMH(Java Microbenchmark Harness)由 OpenJDK/Oracle 里面那群开发了 Java编译器的大牛们所开发&#xff0c;是一个功能强大、灵活的工具&#xff0c;它可以用于检测和评估Java应用程序的性能&#xff0c;主要目的是测量Java应用程序的性能&#xff0c;尤其是在多线程…

SpringBoot 中的 Aop + 自定义注解(内含源代码)

SpringBoot 中的 Aop 自定义注解&#xff08;内含源代码&#xff09; 源代码下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87553544 目录SpringBoot 中的 Aop 自定义注解&#xff08;内含源代码&#xff09;源代码下载链接地址&#xff1a;…

Docker WIndows最新版(4.17.x)修改镜像存储路径

一般情况 在 Docker Desktop 4.17.0 版本中&#xff0c;可以按照以下步骤来修改 Docker 镜像存储路径 打开 Docker Desktop 应用程序&#xff0c;单击顶部菜单栏中的 Docker Desktop 菜单&#xff0c;然后选择 Resources&#xff08;资源&#xff09;选项卡。 在 Resources 选…

【微信小程序】-- 自定义组件 -- 创建与引用 样式(三十二)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

信创国产化替代势在必行,FTP有替代产品吗?

自2018年开始&#xff0c;由于国外对IT技术发展的限制&#xff0c;在“华为、中兴事件”催化下&#xff0c;我国信创进入快速推广期。信创的产业庞大&#xff0c;涉及基础硬件&#xff08;芯片、服务器等&#xff09;、基础软件&#xff08;操作系统、数据库、中间件等&#xf…