Python爬虫快速入门,静态网页爬取( 二 )


其实,它们只是看上去一样,实际上却属于不同种类 。现在尝试用type()函数将re.text和BeautifulSoup对象的类型打印出来对比一下:
import requestsfrom bs4 import BeautifulSoupheaders = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36'}re = requests.get('https://book.douban.com/top250', headers=headers)soup = BeautifulSoup(re.text, 'html.parser')print(type(re.text))soup = BeautifulSoup(re.text, 'html.parser')print(type(soup))通过输出结果可以看出,re.text的类型是字符串,而soup的类型是BeautifulSoup对象,它俩是完全不同的东西 。相比字符串,BeautifulSoup对象里有很多强大的方法和属性 。通过这些方法和属性,我们就能方便快捷地提取出我们所需要的数据 。
二、数据提取BeautifulSoup对象里的方法和属性有很多,我们只学习其中最常用的一些,这些足以应付大多数场景 。等你真正的入门后,可以自行学习那些更高阶的知识去解决更复杂的问题 。
2.1 find()与find_all()BeautifulSoup对象里的find()和find_all()是我们提取数据最常用的两个方法 。借助它们,我们可以过滤掉HTML页面里的无用数据,轻松地找到我们需要的数据 。
我们先来看一下find()和find_all()的作用和区别:
方法作用find()返回符合条件的首个数据find_all()返回符合条件的所有数据
我们通过一个例子进一步熟悉这两个方法,假设我们获取到的网页源代码如下:
<div class="content"><a href=https://www.isolves.com/it/cxkf/yy/Python/2020-08-25/"https://douban.com">登录/注册

豆瓣读书 Top 250

豆瓣书店
接下来分别使用find()与find_all(),观察输出结果的差异:
print(soup.find('a'))print(soup.find_all('a'))其中,使用find()方法输出的结果为:
<a href=https://www.isolves.com/it/cxkf/yy/Python/2020-08-25/"https://douban.com">登录/注册而使用find_all()方法输出的结果为:
[<a href=https://www.isolves.com/it/cxkf/yy/Python/2020-08-25/"https://douban.com">登录/注册,豆瓣书店,红楼梦,百年孤独,白夜行]可以看到,find()方法返回了第一个a标签,而find_all()方法则返回了所有的a标签 。它俩的用法基本一样,都是传入HTML标签名称,返回符合该HTML标签的数据 。区别是find()方法只返回第一个符合条件的标签,而find_all()方法返回所有符合条件的标签列表 。
除了传入标签名称外,这两个方法还支持传入属性进行筛选,返回符合条件的数据 。例如:
soup.find('div', id='a') # 查找id='a'的div标签soup.find_all('var', class_='b') # 查找所有class='b'的var标签soup.find('button', id='c', class_='d') # 查找id='c'且class='d'的button标签
注:因为class是Python中定义类的关键字,因此用class_表示HTML中的class 。
2.2 Tag对象BeautifulSoup将HTML中的元素封装成了Tag对象 。和BeautifulSoup对象一样,Tag对象里也有find()和find_all()方法 。因此,我们可以不断地调用这两个方法,一层一层地找到我们需要的数据 。依然使用之前的例子:
<div class="content"><a href=https://www.isolves.com/it/cxkf/yy/Python/2020-08-25/"https://douban.com">登录/注册

豆瓣读书 Top 250

豆瓣书店
【Python爬虫快速入门,静态网页爬取】我们可以看到,书名在a标签中 。但如果直接使用soup.find_all(‘a’)的话,第二行的“登录/注册”和第五行的“豆瓣书店”也会被获取到,因此我们需要将这些无效数据过滤掉 。


推荐阅读