一、kindEditor编辑器

  此编辑的使用官方文档介绍地址为:http://kindeditor.net/doc.php,具体的应用实例如下:

1、下载并配置

  在官方下载好编辑器文件后,将其放在静态文件夹下,并按如下实例引用其文件,同时需要引用jquery文件:

<script src="/static/kindeditor/kindeditor-all-min.js"></script>

2、编辑器展示

  编辑器的使用必须要与一个<textarea>标签绑定,具体见如下实例:

<textarea name="content" id="editor_id" cols="30" rows="10"></textarea><script>// 富文本编辑器
        KindEditor.ready(function (K) {window.editor = K.create('#editor_id', {width: "99%",height: "600px",
                resizeType: 1,                        //高度可调,宽度不可调
                uploadJson: "/upload_img/",           //指定上传图片等文件的时要执行的函数(用于保存图片,并返回)
                extraFileUploadParams: {              //设置上传文件时需要的参数
                    csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val()},filePostName: "article_img"            //设置上传图片的文件名
});});
</script>

3、上传图片等文件设置

  如2小节中,我们展示了编辑器以后,其实并不能直接进行上传图片等功能,需要按如上设置文件上传需要的参数,其中处理上传文件的函数实例如下:

from s7_cnblog import settings
import osdef upload_img(request):                   #用于处理编辑器上传的文件print(request.FILES)fileObj=request.FILES.get("article_img")path=os.path.join(settings.MEDIA_ROOT,"article_img",fileObj.name)with open(path,"wb") as f:for line in fileObj:f.write(line)#服务器将图片保存成功后,以如下形式将json形式返回给编辑器用于显示res={"error":0,"url":"/media/article_img/"+fileObj.name}return HttpResponse(json.dumps(res))

  注意通过文本编辑器编辑的文本(即textarea标签的文本)值是标签字符串!

二、beautifulsoup模块简单实用

  如上,我们文本编辑器提交的内容是一堆标签字符串,同样我们通过爬虫手段获得的内容也是网页的标签的字符串,如何能获得我们想要关于标签中有效文本或者内容,我们就需要用到beautifulsoup模块,它是python的一个标准库,主要应用方向也是爬虫。

1、beautifulsoup安装

pip install beautifulsoup4

2、使用介绍

  将一段文档传入BeautifulSoup 的构造方法,就能得到一个文档的对象, 可以传入一段字符串或一个文件句柄,如下例:

from bs4 import BeautifulSoup
soup = BeautifulSoup(open("index.html"))
soup = BeautifulSoup("<html>data</html>")

  上述我们并没有为Beautiful Soup指定解析器,然后,Beautiful Soup会选择最合适的解析器来解析这段文档,如果手动指定解析器那么Beautiful Soup会选择指定的解析器来解析文档。如下例我们指定的html.parser解析器为python默认的解析器。

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')

  其他常用解析器如下介绍,除python默认解析器外,其他解析器使用前需要安装:

3、节点对象

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p><p class="story">...</p>
"""

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')

  以下所有实例,除有说明外,均已上述的soup文档对象为例。

  Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为四种,分别为:Tag , NavigableString , BeautifulSoup , Comment ,介绍如下:

(一)tag对象

  通俗点讲就是 HTML 中的一个个标签,Tag 对象与XML或HTML原生文档中的tag相同。

1、获取标签对象

  我们可以利用 soup加标签名轻松地获取这些标签的内容,注意,它查找的是在所有内容中的第一个符合要求的标签。如下例:

#点标签名的方式获取符合条件的第一个标签对象
soup=BeautifulSoup(html_doc,"html.parser")
print(soup.head)                                          #结果:<head><title>The Dormouse's story</title></head>
print(soup.head.title)                                    #结果:<title>The Dormouse's story</title>

  此外,可以通过find_all()方法获得所有同一标签名字的标签对象,结果为一个列表,实例如下:

print(soup.find_all("a"))
'''
结果为:
[<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
'''

2、获取标签属性

  通过tag[属性名]方式可以获得对应属性值,class属性值以列表形式显示,通过tag.attrs方式可以获得标签所有的属性值,结果以键值对的形式的显示,实例如下:

soup=BeautifulSoup(html_doc,"html.parser")
tag=soup.p                #标签对象: #<p class="title" id="info"><b>The Dormouse's story</b></p>
print(tag.name)           #获取标签名字:p
print(tag["class"])       #获取标签class属性值,因为class属性值有可能有多个,所以用列表形式显示:['title']
print(tag.attrs)          #获取标签中的所有的属性值,以键值对的形式显示:{'class': ['title'], 'id': 'info'}

3、标签属性操作

  标签属性可以被添加、修改和删除,其操作方式和字典的操作方式是一样的,如下例:

soup=BeautifulSoup(html_doc,"html.parser")
tag=soup.p
print(tag)                  #标签对象: #<p class="title" id="info"><b>The Dormouse's story</b></p>
tag["class"]="test"
tag["id"]=1
print(tag)                  #若原来有此属性,则重新赋值,若没有则重新添加:<p class="test" id="1"><b>The Dormouse's story</b></p>

  属性删除实例如下:

del tag["class"]
del tag["id"]
print(tag)   #结果为:<p><b>The Dormouse's story</b></p>

(二)NavigableString(字符串)

  字符串对象指的就是标签对象中文本,那我们如何获得标签对象中的文本内容呢?tag.string方法就可以很容易获得,实例如下:

soup=BeautifulSoup(html_doc,"html.parser")
tag=soup.p
print(tag)                        #<p class="title" id="info">this is test!<b>The Dormouse's story</b></p>
print(tag.string)                 #None
print(tag.b.string)               #The Dormouse's story
print(tag.text)                   #this is test!The Dormouse's story

  如上实例,我们可以看出:通过tag.string方法只能得到当前标签对象内的字符串对象,若当前标签对象内还有其他标签,则不能得到相应的字符串,text方法可以弥补这一点,它可以获得标签或者标签字符串内的所有文本内容。

  可以通过replace_with方法替换标签对象内的字符串内容,实例如下:

tag.b.string.replace_with("hello world")
print(tag)                       #<p class="title" id="info">this is test!<b>hello world</b></p>

(三)comment对象

  当标签对象中的文本是被注释的状态,通过tag.string也可得到注释掉的文本,此时我们并看不出此文本是否为被注释,但是通过打印其类型,我们发现被注释的文本不再是字符串类型,而是comment类型。实例如下:

html_doc='<a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>'
soup = BeautifulSoup(html_doc, 'html.parser')
print(soup.a.string)            # Elsie
print(type(soup.a.string))      #<class 'bs4.element.Comment'>

  为了避免通过tag.string方法获得这种字符串对象和comment对象的混淆而带来的不必要的麻烦,一般我们可以通过做判断进行区分,如下实例:

if type(soup.a.string)==bs4.element.Comment:print soup.a.string

(四)beautifulsoup对象

  beautifulsoup对象就是我们上述反复实例出的soup对象,表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag。这里不做详细的介绍了。

三、beautifulsoup的遍历文档树

1、子节点

  一个Tag可能包含多个字符串或其它的Tag,这些都是这个Tag的子节点.Beautiful Soup提供了许多操作和遍历子节点的属性。

(1).contens:tag的 .contents 属性可以将tag的子节点以列表的方式输出,实例如下:

soup=BeautifulSoup(html_doc,"html.parser")
tag=soup.p
print(tag)           #<p class="title" id="info">this is test!<b>The Dormouse's story</b></p>
print(tag.contents)  #['this is test!', <b>The Dormouse's story</b>]

  字符串没有 .contents 属性,因为字符串没有子节点,实例如下:

print(tag.contents[1].contents)  #["The Dormouse's story"]
print(tag.contents[0].contents)  #报错

(2).children:与contents方法不同的是,.children方法得到的是一个list生成器,需要通过循环取到它的子节点,如下例:

soup=BeautifulSoup(html_doc,"html.parser")
tag=soup.p
print(tag)             #<p class="title" id="info">this is test!<b>The Dormouse's story</b></p>
print(tag.children)    #<list_iterator object at 0x000001410F2305C0>
for child in tag.children:print(child)
'''
this is test!
<b>The Dormouse's story</b>
'''

(3).descendants

  与.contents 和 .children 不同的是,如上例,上述二者属性仅包含tag的直接子节点,即儿子节点;.descendants则包含tag对象的所有的子节点,儿子和孙子,即所有后代节点,结果也是一个迭代器,可以通过循环得到所有的后代节点,实例如下:

soup=BeautifulSoup(html_doc,"html.parser")
tag=soup.p
print(tag)  #<p class="title" id="info">this is test!<b>The Dormouse's story</b></p>
print(tag.descendants)  #<generator object descendants at 0x000001AA382130F8>
for descendant in tag.descendants:print(descendant)
'''
this is test!
<b>The Dormouse's story</b>
The Dormouse's story
'''

2、父节点

  .parent (获得直接父节点)

  .parents(递归获得所有父辈节点),结果为生成器,通过循环操作

3、兄弟节点

  兄弟节点可以理解为和本节点处在统一级的节点,.next_sibling 属性获取了该节点的下一个兄弟节点,.previous_sibling 则与之相反,如果节点不存在,则返回 None。注意:实际文档中的tag的 .next_sibling 和 .previous_sibling 属性通常是字符串或空白,因为空白或者换行也可以被视作一个节点,所以得到的结果可能是空白或者换行。

  通过 .next_siblings 和 .previous_siblings 属性可以对当前节点的兄弟节点迭代输出。

4、前后节点

  与 .next_sibling  .previous_sibling 不同,它并不是针对于兄弟节点,而是在所有节点,不分层次,上个节点属性:.next_element 下个节点属性:  .previous_element ,通过 .next_elements 和 .previous_elements 的迭代器就可以向前或向后访问文档的解析内容,就好像文档正在被解析一样

四、beautifulsoup的搜索文档树

1、find_all( name , attrs , recursive , string , **kwargs )

  find_all() 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件:

(1)name参数

(2)keyword参数

(3)text参数

(4)limit参数

(5)recursive参数

2、find( name , attrs , recursive , string , **kwargs )

  find_all() 方法将返回文档中符合条件的所有tag,尽管有时候我们只想得到一个结果.比如文档中只有一个<body>标签,那么使用 find_all() 方法来查找<body>标签就不太合适, 使用 find_all 方法并设置 limit=1 参数不如直接使用 find() 方法

五、beautifulsoup的css选择器

  我们在写 CSS 时,标签名不加任何修饰,类名前加点,id名前加 #,在这里我们也可以利用类似的方法来筛选元素,用到的方法是 soup.select(),返回类型是 list,如下实例介绍:

转载于:https://www.cnblogs.com/seven-007/p/8135897.html

python之路_kindEditor编辑器及beautifulsoup模块相关推荐

  1. Python之路(第二十篇) subprocess模块

    一.subprocess模块 subprocess英文意思:子进程 那什么是进程呢? (一)关于进程的相关理论基础知识 进程是对正在运行程序的一个抽象,进程的概念起源于操作系统,是操作系统最核心的概念 ...

  2. Python之路(第二十一篇) re模块

    一.re模块 正则表达式本身是一种小型的.高度专业化的编程语言,正则表达式就是字符串的匹配规则,在多数编程语言里都有相应的支持,python里对应的模块是re,正则表达式模式被编译成一系列的字节码,然 ...

  3. Python之路(第十七篇)logging模块

    一.logging模块 (一).日志相关概念 日志是一种可以追踪某些软件运行时所发生事件的方法.软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情.一个事件可以用一个可包含可选变 ...

  4. python之路——模块和包

    一.模块 1.什么是模块? 常见的场景:一个模块就是一个包含了Python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1.使用Python编 ...

  5. python版本回退_Python爬虫之BeautifulSoup解析之路

    上一篇分享了正则表达式的使用,相信大家对正则也已经有了一定的了解.它可以针对任意字符串做任何的匹配并提取所需信息. 但是我们爬虫基本上解析的都是html或者xml结构的内容,而非任意字符串.正则表达式 ...

  6. python爬虫之使用BeautifulSoup模块抓取500彩票网竞彩足球赛果及赔率

    目录 前言 分析思路 数据储存 代码 结果展示 结语 前言 竞彩足球是目前比较受欢迎的一种体彩彩种,玩法较为灵活多样,赔率可观,今天就来记录一下如何抓取竞彩足球的开奖信息和赔率. 分析思路 我使用的网 ...

  7. python爬取小说章节信息用pygame进行数据显示_爬虫不过如此(python的Re 、Requests、BeautifulSoup 详细篇)...

    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 爬虫的本质就是一段自动抓取互联网信息的程序,从网络获取 ...

  8. python自动化办公模块有哪些-python常见的命令行交互自动化模块有哪些

    用Python写的程序,保存为.py,添加什么命令才能使我一般都是在后面加一个输入语句. python可不可以采用非命令行方式 可以,预先写好代码 使用pythonw.exe执行py文件可以不打开黑框 ...

  9. BeautifulSoup模块学习文档

    一.BeautifulSoup简介 1.BeautifulSoup模块 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档 ...

  10. Python之路【第五篇】:面向对象及相关

    Python之路[第五篇]:面向对象及相关 Python之路[第五篇]:面向对象及相关 面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance ...

最新文章

  1. Java高级-线程同步机制实现
  2. solr从pdf、office文档中建立索引
  3. Oracle性能误区--MTS,RAC,分区,并行查询
  4. Eurek Ribbon Feign常见问题及解决
  5. 配置安全域名https申请免费证书并配置nginx运行环境
  6. 【C++深度剖析教程9】初探C++标准库
  7. K8S学习笔记之使用Fluent-bit将容器标准输入和输出的日志发送到Kafka
  8. linux下c爬取天气的源码,一个在conky中实现获取本地天气的c源代码
  9. 计算机交流会活动流程,新老生交流会活动方案
  10. 微信小程序 转发功能的实现
  11. 网吧里电脑提示计算机内存不足,网吧电脑显示虚拟内存不足该怎么办呢
  12. Babel转码器安装及使用
  13. RibbitMQ入门实战详解
  14. extjs6 清除grid中combo列的值
  15. 低代码常见场景【上】|如何解决业务问题
  16. memset()函数怎么用?
  17. 网络基础系统红枫产线落地金华,助力打造千亿级产业集群!
  18. 图像分类——猫狗大战问题
  19. 【Temasek V9.6】CM13.0 多功能实用增强版 for 华为荣耀5X
  20. 新华社中移动共建搜索引擎

热门文章

  1. 【渝粤教育】国家开放大学2018年春季 3818-21T燃气工程施工 参考试题
  2. linux 统计 程序运行时间
  3. Java json字符串转Object
  4. windows server 2012 --安装远程桌面服务后无法远程的问题
  5. win 10 系统激活
  6. 1章 SpringBoot介绍
  7. Leetcode513. Find Bottom Left Tree Value找树左下角的值
  8. [leetcode] 65. 有效数字
  9. 传播路径图调查2013年初
  10. .Net中的设计模式——Strategy模式