【一起学爬虫】BeautifulSoup库详解

回顾

上一次介绍正则表达式的时候,分享了一个爬虫实战,即爬取豆瓣首页所有的:书籍、链接、作者、出版日期等。在上个实战中我们是通过正则表达式来解析源码爬取数据,整体来说上次实战中的正则表达式是比较复杂的,所以引入了今天的主角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(),方便

记住常用的获取属性和文本值的方法

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20190402A083GC00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券