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: