图片来自风变
一 什么是BeautifulSoup
BeautifulSoup 是Python的第三方库,用来parse 和提取html 或xml的一种工具。我们平时使用浏览器上网,浏览器会将从服务器获取的数据翻译成我们可以看得懂的语言,爬虫做的工作也是类似。
二 BeautifulSoup有什么用
BeautifulSoup有两个作用:
1)解析数据:
d2g 01-2019325115528.png
BS解析数据要有两个参数,第一个参数必须是字符串,第二个用来标识解析器。
screenshot-www.pypypy.cn-2020.11.25-21_20_51.png
其中,soup的数据类型为beautifulsoup对象。通过打印出来的源代码我们可以发现,打印soup出来的源代码和我们之前使用response.text打印出来的源代码是完全一样的。原因是:虽然response.text和soup打印出的内容表面上看长得一模一样,却有着不同的内心,它们属于不同的类:<class 'str'> 与<class 'bs4.BeautifulSoup'>。前者是字符串,后者是已经被解析过的BeautifulSoup对象。之所以打印出来的是一样的文本,是因为BeautifulSoup对象在直接打印它的时候会调用该对象内的str方法,所以直接打印 bs 对象显示字符串是str的返回结果。如果这不是一个BeautifulSoup对象,我们是没法调用相关的属性和方法。
2)提取数据:
crawler-l2-4-201919.png
BeautifulSoup提取数据有两大步 find()和find_all();tag对象。
find()与find_all()是BeautifulSoup对象的两个方法,它们可以匹配html的标签和属性,把BeautifulSoup对象里符合要求的数据都提取出来。find()只提取首个满足要求的数据。find()方法将代码从上往下找,找到符合条件的第一个数据,不管后面还有没有满足条件的其他数据,停止寻找,立即返回。find_all()顾名思义(find all:查找全部),提取出的是所有满足要求的数据。代码从上往下找,一直到代码的最后,把所有符合条件的数据揣好,一起打包返回。
2019-01-23-16-36-57.png
tips: 从图片可以看到, 源代码中的class属性在用find查找时,形式为class_,是为了区分python中的class类,当然,除了用class属性去匹配,还可以使用其它属性,比如style属性等。其次,括号中的参数:标签和属性可以任选其一,也可以两个一起使用,这取决于我们要在网页中提取的内容。
通过find()和find_all()打印出来的数据含着html标签,如果要得到纯文本或者图片,还要用到tag对象。
crawler-l2-16-201919.png
上图是Tag对象的3种用法,Tag对象可以使用find()与find_all()来继续检索,Tag.text提出Tag对象中的文字,用Tag['href']提取出URL
三,对象的变化过程
2019-10-21-15-56-22.png我们的操作对象从URL链接到了Response对象。而这一关,我们的操作对象是这样的:Response对象——字符串——BS对象。到这里,又产生了两条分岔:一条是BS对象——Tag对象;另一条是BS对象——列表——Tag对象。
总结
用bs库解析数据和提取数据
解析数据的方法是用BeautifulSoup()。
提取数据的方法是用find()与find_all()。
在BeautifulSoup
中,不止find()
和find_all()
,还有select()
也可以达到相同目的。
其实,在bs的官方文档中,find()
与find_all()
的方法,其实不止标签和属性两种,还有这些:
网友评论