第3课 BeautifulSoup是什么

一、BeautifulSoup是什么?

1. 使用BeautifulSoup可以解析和提取网页中的数据。

1)解析数据:我们平时使用浏览器上网,浏览器会把服务器返回来的HTML源代码翻译为我们能看懂的样子,之后我们才能在网页上做各种操作。而在爬虫中,也要使用能读懂html的工具,才能提取到想要的数据。这就是解析数据。

2)提取数据:是指把我们需要的数据从众多数据中挑选出来。

2.安装BeautifulSoup:

BeautifulSoup不是Python标准库,需要单独安装它。你需要在终端单击开始-运行-输入cmd- 输入一行代码:pip install BeautifulSoup4。(Mac电脑需要输入pip3 install BeautifulSoup4)

二、BeautifulSoup怎么用?

1.用BeautifulSoup解析数据

 bs对象= BeautifulSoup( 要解析的文本,‘解析器’)

要解析的文本必须是字符串,我们要用的是一个Python内置库:html.parser。(它不是唯一的解析器,但是比较简单的)

1)根据之前所学的requests.get(),我们可以先获取到一个Response对象,并确认自己获取成功:

import requests#调用requests库

res=requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')#获取网页源代码,得到的res是response对象

print(res.status_code)#检查请求是否正确响应

html=res.text#把res的内容以字符串的形式返回

print(html)#打印html

2)接下来就轮到BeautifulSoup登场解析数据了,请特别留意第2行和第6行新增的代码:

import requests

from bs4 import BeautifulSoup#引入BS库res=requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')

html=res.text

soup=BeautifulSoup(html,'html.parser')#把网页解析为BeautifulSoup对象

3)虽然response.text和soup打印出的内容表面上看长得一模一样,却有着不同的内心,它们属于不同的类: 与。前者是字符串,后者是已经被解析过的BeautifulSoup对象。之所以打印出来的是一样的文本,是因为BeautifulSoup对象在直接打印它的时候会调用该对象内的str方法,所以直接打印 bs 对象显示字符串是str的返回结果。

我们之后还会用BeautifulSoup库来提取数据,如果这不是一个BeautifulSoup对象,我们是没法调用相关的属性和方法的。

用BeautiflSoup解析数据就是这关键的两行代码:

from bs4 import BeautifulSoup 

soup=BeautifulSoup(字符串,'html.parser')

2. 用BeautifulSoup提取数据

1)find():只提取首个满足要求的数据。

2)find_all():提取出的是所有满足要求的数据。

括号中的参数:标签和属性可以任选其一,也可以两个一起使用,这取决于我们要在网页中提取的内容。

3)通过标签提取:

import requests

from bs4 import BeautifulSoup

url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/spder-men0.0.html'

res = requests.get (url)

print(res.status_code)

soup = BeautifulSoup(res.text,'html.parser')

item = soup.find('div') #使用find()方法提取首个

元素,并放到变量item里。

print(type(item)) #打印item的数据类型

print(item)      #打印item

4) 通过属性提取:

import requests # 调用requests库

from bs4 import BeautifulSoup # 调用BeautifulSoup库

res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')# 返回一个Response对象,赋值给res

html = res.text# 把Response对象的内容以字符串的形式返回

soup = BeautifulSoup( html,'html.parser') # 把网页解析为BeautifulSoup对象

items = soup.find_all(class_='books') # 通过匹配标签和属性提取我们想要的数据

print(items) # 打印items

print(type(items)) #打印items的数据类型

# 数据类型是, 前面说过可以把它当做列表list来看待。

#列表并不是我们最终想要的东西,我们想要的是列表中的值,所以要想办法提取出列表中的每一个值。

#用for循环遍历列表,就可以把这三个

元素取出来了。

for item in items:

    print('想找的数据都包含在这里了:\n',item) # 打印item

我们一般会选择用type()函数查看一下数据类型,因为Python是一门面向对象编程的语言,只有知道是什么对象,才能调用相关的对象属性和方法。

    print(type(item))

我们看到它们的数据类型是,是Tag对象,不知道你是否还记得,这与find()提取出的数据类型是一样的。

3) Tag类对象的常用属性和方法:

import requests# 调用requests库

from bs4 import BeautifulSoup# 调用BeautifulSoup库

res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')# 返回一个response对象,赋值给reshtml=res.text# 把res解析为字符串

html = res.text# 把Response对象的内容以字符串的形式返回

soup = BeautifulSoup(html,'html.parser')# 把网页解析为BeautifulSoup对象

items = soup.find_all(class_='books')# 通过匹配属性class='books'提取出我们想要的元素

for item in items:# 遍历列表

itemsfind = item.find('h2')# 在列表中的每个元素里,匹配标签

提取出数据

title = item.find(class_='title')# 在列表中的每个元素里,匹配属性class_='title'提取出数据

brief = item.find(class_='info')# 在列表中的每个元素里,匹配属性class_='info'提取出数据

print(kind.text,'\n',title.text,'\n',title['href'],'\n',brief.text)# 打印书籍的类型、名字、链接和简介的文字

运行以上代码,我们就可以完成解析数据和提取数据的工作了。

每个网页都有自己的结构,我们写爬虫程序,还是得坚持从实际出发,具体问题具体分析。

三、操作对象的转换过程

1. 从最开始用requests库获取数据,到用BeautifulSoup库来解析数据,再继续用BeautifulSoup库提取数据,不断经历的是我们操作对象的类型转换。如图:

我们的操作对象从URL链接到了Response对象。

然后沿这条路:Response对象——字符串——BS对象。

后来又产生了两条分岔:一条是BS对象——Tag对象;另一条是BS对象——列表——Tag对象。

2. 在BeautifulSoup中,不止find()和find_all(),还有select()也可以达到相同目的。

你可能感兴趣的:(第3课 BeautifulSoup是什么)