本文 Github/javamap 已收录,有Java程序员进阶技术知识地图以及我的系列文章,欢迎大家Star。
BeautifulSoup是一个可以从HTML或XML文件中提取数据的python库。
“Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。”
创建本地文件index.html,写入如下
1、读取内容,格式化输出
import bs4
soup = bs4.BeautifulSoup(open('E:\indext.html'), 'html.parser') # this is the path of index.html
# open index.html, and create a object soup
print (soup.prettify())
# format and print
2、四大对象种类
- Tag
- NavigableString
- BeautifulSoup
- Comment
(1)Tag:标签
<title>hello</titile> <a>world</a>......
上面的每一个色块就构成了一个标签,也就是说标签除了HTML标签,还包括中间的内容。
如何获取标签呢?
我们可以这样写:(蓝色背景的为输出)
print soup.p
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
虽然HTML内容中有好些个p标签,但是这种形式的调用,只会输出所有内容中第一个符合要求的标签
对象的类型可以通过type获得,即:
print type(soup.p)
<class 'bs4.element.Tag'>
对于Tag, 它有两个重要的属性,name 和 attrs
print soup.name
print soup.p.name
[doucument]
p
soup对象本身比较特殊,它的name即为[document],对于其他内部标签,输出的值便为标签本身的名称。
print soup.p.attrs
{u'class': [u'title'], u'name': u'dromouse'}
p标签的所有属性打印出来,得到的类型是一个字典
如果想要单独获取某个属性,可以给定属性名称
print(soup.p['class']) or print soup.p.get('class')
[u'title']
对属性和内容进行修改
soup.p['class'] = 'newClass'
print soup.p
<p class="newClass" name="dromouse"><b>The Dormouse's story</b></p>
对属性进行删除
del soup.p['class']
<p name="dromouse"><b>The Dormouse's story</b></p>
(2)NavigableString
上面介绍了获取标签内容,而.string可以获得标签内部的文字
print soup.p.string
The Dormouse's story
类型是NavigableString,同样可以通过type获得
(3)BeautifulSoup
BeautifulSoup对象表示的是一个文档的全部内容,大部分时候,可以把它当做Tag对象,是一个特殊的Tag
print type(soup.name)
<type 'unicode'>
(4)Comment
comment对象是一个特殊类型的NavigableString对象,其实输出的内容仍然不包括注释符号,但是如果不好好处理,可能会给我们的文本处理造成麻烦
print type(soup.p.string)
print type(soup.a.string)
print soup.a.string
<class 'bs4.element.NavigableString'>
<class 'bs4.element.Comment'>
Elsie
可以看到soup.a.string是comment类型,并且其中的注释符号被去掉了,这会带来麻烦。
所以这样的情况,我们需要事先做下判断:if type(soup.a.string) == bs4.element.comment:
-- END --
日常求赞:你好技术人,先赞后看养成习惯,你的赞是我前进道路上的动力,对我非常重要。
加油技术人!
简介: 博主从华中科技大学硕士毕业,是一个对技术有追求,对生活有激情的程序员。几年间浪迹于多个一线互联网大厂,具有多年开发实战经验。
微信搜索公众号【爱笑的架构师】,我有技术和故事,等你来。
文章持续更新,在 Github/javamap 中可以看到我归档的系列文章,有面试经验和技术干货,欢迎Star。