回顾
上一次介绍正则表达式的时候,分享了一个爬虫实战,即爬取豆瓣首页所有的:书籍、链接、作者、出版日期等。在上个实战中我们是通过正则表达式来解析源码爬取数据,整体来说上次实战中的正则表达式是比较复杂的,所以引入了今天的主角BeautifulSoup:它是灵活方便的网页解析库,处理高效,而且支持多种解析器。使用Beautifulsoup,不用编写正则表达式就可以方便的实现网页信息的提取。
一、 BeautifulSoup的安装
pip install beautifulsoup4
二、用法讲解
1. 解析库
解析器
使用方法
优势
劣势
2.基本使用
下面是一个不完整的html:body标签、html标签都没有闭合
下面使用lxml解析库解析上面的html
下面是容错处理时标签补全后的结果和获取的title内容,可以看到html和body标签都被补全了:
3.标签选择器
(1)选择元素
依旧使用上面的html
结果是:
从结果发现只输出了一个p标签,但是HTML中有3个p标签
标签选择器的特性:当有多个标签的时候,它只返回第一个标签的内容
(2)获取属性
输出结果:
dromouse
dromouse
(3) 获取内容
输出结果:
The Dormouse's story
(4) 嵌套获取属性
输出:
The Dormouse's story
(5)获取子节点和子孙节点
输出的是一个列表
另外一种获取方式
输出:
(6)获取父节点
程序打印出的是p标签,即a标签的父节点:
于此类似的还有:
parents属性:输出当前标签的所有祖先节点
next_sibings 属性:输出当前标签之后的兄弟标签
previous_sibling属性输出当前标签之前的兄弟标签
上面是标签选择器:处理速度很快,但是这种方式不能满足我们解析HTML的需求。因此beautifulsoup还提供了一些其他的方法
4.标准选择器
**find_all( name , attrs , recursive , text ,kwargs )
可根据标签名、属性、内容查找文档
下面使用的测试HTML都是下面这个
(1) 根据标签名,即name查找
输出了所有的ul标签:
上述可以继续进行嵌套:
(2)根据属性名进行查找
输出:
(3)根据文本的内容,即text进行选择
输出:
['Foo;'Foo']
返回的不是标签,在查找的时候用途不大,更多是做内容匹配
find( name , attrs , recursive , text , kwargs )
和findall类似,只不过find方法只是返回单个元素
find_parents() find_parent()
find_parents()返回所有祖先节点,find_parent()返回直接父节点。
find_next_siblings() find_next_sibling()
find_next_siblings()返回后面所有兄弟节点,find_next_sibling()返回后面第一个兄弟节点。
find_previous_siblings() find_previous_sibling()
find_previous_siblings()返回前面所有兄弟节点,find_previous_sibling()返回前面第一个兄弟节点。
find_all_next() find_next()
find_all_next()返回节点后所有符合条件的节点, find_next()返回第一个符合条件的节点
find_all_previous() 和 find_previous()
find_all_previous()返回节点后所有符合条件的节点, find_previous()返回第一个符合条件的节点
5.CSS选择器
通过select()直接传入CSS选择器即可完成选择
输出:
也可以进行嵌套,不过没必要,上面通过标签之间使用空格就实现了嵌套:
输出:
6.获取到html后如何获取属性和内容:
7.总结
推荐使用lxml解析库,必要时使用html.parser
标签选择筛选功能弱但是速度快
建议使用find()、find_all() 查询匹配单个结果或者多个结果
如果对CSS选择器熟悉建议使用select(),方便
记住常用的获取属性和文本值的方法
领取专属 10元无门槛券
私享最新 技术干货