毕业设计中有一同学用了BeautifulSoup4,之前也看到过这个库,但不知道是用来干嘛的,后来在看廖雪峰的商业爬虫时了解到,这个库也和Xpath一样,是用来解析DOM文档,在这里写篇博客简单介绍一下。
简介
Beautiful Soup 是一个可以从DOM文件(HTML或XML)中提取数据的Python库,和Xpath的作用类似,有官方中文文档
四大对象
BeautifulSoup将对象分为以下四类
Tag
Tag
对象和XML或者HTML原生文档中的tag相同,如<a></a>
或<div></div>
。通过.name
获取Tag对象
1 | soup = BeautifulSoup('<b class="boldest">Extremely bold</b>') |
运行结果如下:
1 | <b class="boldest">Extremely bold</b> |
同时一个Tag可能有很多属性,Tag属性的操作方法与字典相同,多值属性通过列表的方式返回。也可用.attrs
的方式获取到其属性的字典形式。
1
2print(tag['class'])
print(tag.attrs)
运行结果如下:
1 | boldest |
NavigableString
一个 NavigableString 字符串与Python中的Unicode字符串相同,并且还支持包含在 遍历文档树 和 搜索文档树 中的一些特性。一般来说,NavigableString就是元素中的文本。如:
1 | soup = BeautifulSoup('<b class="boldest">Extremely bold</b>') |
运行结果如下:
1
Extremely bold
BeautifulSoup
BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,它支持 遍历文档树 和 搜索文档树 中描述的大部分的方法。
个人认为,BeautifulSoup对象就是用来承接DOM文档,并提供解析操作的对象。
Comment
Comment是一个特殊类型的NavigableString 对象,一般用来承接DOM中的注释部分。如:
1 | markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>" |
运行结果如下:
1 | Hey, buddy. Want to buy a used parser? |
值得注意的是:一旦<b></b>
标签内除了注释有其他的东西,比如其他标签或者文本,则comment的值为None,type为NoneType
常用的函数
find_all和find
查询所有符合条件的对象,以列表的形式返回。其函数头为:def find_all(self, name=None, attrs={}, recursive=True, text=None,limit=None, **kwargs)
参数name为标签的名字。参数attrs为标签的属性,以字典的形式导入。参数recurive为True则表示递归查询。参数limit表示当查询到的结果为其值时停止查询。
find返回符合查询条件的第一个标签,本质还是调用find_all,不过是设置了limit=1
。
1 | html=''' |
运行结果如下:
1 | [<li class="item-0"><a href="link1.html">first item</a></li>, <li class="item-1"><a href="link2.html">second item</a></li>] |
select和select_one
select和select_one都是以CSS选择器的语法找Tag,如:
1 | result=soup.select(".item-1") |
运行结果如下:
1 | [<li class="item-1"><a href="link2.html">second item</a></li>] |