Python爬虫笔记——BeautifulSoup模块
Target:学会用BeautifulSoup解析和提取网页中的数据。【解析数据】:把服务器返回来的HTML源代码翻译为我们能看懂的样子。【提取数据】:是指把我们需要的数据从众多数据中挑选出来。由于BeautifulSoup不是Python标准库,需要单独安装它:1、win+r2、cmd3、pip install BeautifulSoup4。(Mac电脑需要输入pip3 install Beau
Target:学会用BeautifulSoup解析和提取网页中的数据。
【解析数据】:把服务器返回来的HTML源代码翻译为我们能看懂的样子。
【提取数据】:是指把我们需要的数据从众多数据中挑选出来。
由于BeautifulSoup不是Python标准库,需要单独安装它:
1、win+r
2、cmd
3、pip install BeautifulSoup4。(Mac电脑需要输入pip3 install BeautifulSoup4)
4、安装好就可以使用了。
【解析数据】
BeautifulSoup解析数据的用法很简单,如下:
bs对象 = BeautifulSoup(要解析的文本,‘解析器’)
#在括号中,要输入两个参数,第0个参数是要被解析的文本(注意了,它必须必须必须是字符串)。
#括号中的第1个参数用来标识解析器,我们要用的是一个Python内置库:html.parser。(它不是唯一的解析器,但是比较简单的)
对比:
import requests #调用requests库
res = requests.get('https://www.cnki.net/')
#获取网页源代码,得到的res是response对象
print(res.status_code) #检查请求是否正确响应
h = res.text #把res的内容以字符串的形式返回
print(h)#打印h
import requests
from bs4 import BeautifulSoup #引入BS库
res = requests.get('https://www.cnki.net/')
soup = BeautifulSoup( res.text,'html.parser')
print(type(soup)) #查看soup的类型
print(soup) # 打印soup
看运行结果,soup的数据类型是<class ‘bs4.BeautifulSoup’>,说明soup是一个BeautifulSoup对象。
下一行开始,就是我们打印的soup,它是我们所请求网页的完整HTML源代码。
打印soup出来的源代码和我们之前使用response.text打印出来的源代码是完全一样的。也就是说,我们好不容易用BeautifulSoup写了一些代码来解析数据,但解析出的结果,竟然和没解析之前一样。
事情是这样的:虽然response.text和soup打印出的内容表面上看长得一模一样,却有着不同的内心,它们属于不同的类:<class ‘str’> 与<class ‘bs4.BeautifulSoup’>。前者是字符串,后者是已经被解析过的BeautifulSoup对象。之所以打印出来的是一样的文本,是因为BeautifulSoup对象在直接打印它的时候会调用该对象内的__str__方法,所以直接打印 bs 对象显示字符串是__str__的返回结果。
BeautifulSoup解析数据格式:
from bs4 import BeautifulSoup
soup = BeautifulSoup(字符串,‘html.parser’)
【提取数据】
BeautifulSoup中提取数据的两大知识点:
1、find()与find_all()
2、Tag对象
一、find()与find_all()
1、find()与find_all()是BeautifulSoup对象的两个方法,它们可以匹配html的标签和属性,把BeautifulSoup对象里符合要求的数据都提取出来。
2、它俩的用法基本是一样的,区别在于:find()只提取首个满足要求的数据,而find_all()提取出的是所有满足要求的数据。
find()与find_all的用法:
1、首先,请看举例中括号里的class_,这里有一个下划线,是为了和python语法中的类 class区分,避免程序冲突。当然,除了用class属性去匹配,还可以使用其它属性,比如style属性等。
2、其次,括号中的参数:标签和属性可以任选其一,也可以两个一起使用,这取决于我们要在网页中提取的内容。
3、如果只用其中一个参数就可以准确定位的话,就只用一个参数检索。如果需要标签和属性同时满足的情况下才能准确定位到我们想找的内容,那就两个参数一起使用。
eg:
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()方法提取首个<div>元素,并放到变量item里。
print(type(item)) #打印item的数据类型
print(item) #打印item
print('\n')
items = soup.find_all('div') #用find_all()把所有符合要求的数据提取出来,并放在变量items里
print(type(items)) #打印items的数据类型
print(items) #打印items
结果:
200
<class 'bs4.element.Tag'>
<div>大家好,我是一个块</div>
<class 'bs4.element.ResultSet'>
[<div>大家好,我是一个块</div>, <div>我也是一个块</div>, <div>我还是一个块</div>]
**find()**运行结果正是首个div元素吧!它的数据类型:<class ‘bs4.element.Tag’>,说明这是一个Tag类对象。
**find_all()**运行结果是那三个div元素,它们一起组成了一个列表结构。打印items的类型,显示的是<class ‘bs4.element.ResultSet’>,是一个ResultSet类的对象。其实是Tag对象以列表结构储存了起来,可以把它当做列表来处理。
二、Tag对象
1、Tag.find()和Tag.find_all()
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
# 把res的内容以字符串的形式返回
soup = BeautifulSoup( html,'html.parser')
# 把网页解析为BeautifulSoup对象
items = soup.find_all('div',class_='books') # 通过定位标签和属性提取我们想要的数据
for item in items:
kind = item.find('h2') # 在列表中的每个元素里,匹配标签<h2>提取出数据
title = item.find(class_='title') #在列表中的每个元素里,匹配属性class_='title'提取出数据
brief = item.find(class_='info') #在列表中的每个元素里,匹配属性class_='info'提取出数据
print(kind,'\n',title,'\n',brief) # 打印提取出的数据
print('\n')
print(type(kind),type(title),type(brief)) # 打印提取出的数据类型
print('\n')
运行结果:
<h2><a name="type1">科幻小说</a></h2>
<a class="title" href="https://book.douban.com/subject/27077140/">《奇点遗民》</a>
<p class="info">本书精选收录了刘宇昆的科幻佳作共22篇。《奇点遗民》融入了科幻艺术吸引人的几大元素:数字化生命、影像化记忆、人工智能、外星访客……刘宇昆的独特之处在于,他写的不是科幻探险或英雄奇幻,而是数据时代里每个人的生活和情感变化。透过这本书,我们看到的不仅是未来还有当下。</p>
<class 'bs4.element.Tag'> <class 'bs4.element.Tag'> <class 'bs4.element.Tag'>
<h2><a name="type2">人文读物</a></h2>
<a class="title" href="https://book.douban.com/subject/26943161/">《未来简史》</a>
<p class="info">未来,人类将面临着三大问题:生物本身就是算法,生命是不断处理数据的过程;意识与智能的分离;拥有大数据积累的外部环境将比我们自己更了解自己。如何看待这三大问题,以及如何采取应对措施,将直接影响着人类未来的发展。</p>
<class 'bs4.element.Tag'> <class 'bs4.element.Tag'> <class 'bs4.element.Tag'>
<h2><a name="type3">技术参考</a></h2>
<a class="title" href="https://book.douban.com/subject/25779298/">《利用Python进行数据分析》</a>
<p class="info">本书含有大量的实践案例,你将学会如何利用各种Python库(包括NumPy、pandas、matplotlib以及IPython等)高效地解决各式各样的数据分析问题。由于作者Wes McKinney是pandas库的主要作者,所以本书也可以作为利用Python实现数据密集型应用的科学计算实践指南。本书适合刚刚接触Python的分析人员以及刚刚接触科学计算的Python程序员。</p>
<class 'bs4.element.Tag'> <class 'bs4.element.Tag'> <class 'bs4.element.Tag'>
接下来要做的,就是把Tag对象中的文本内容提出来。
2、Tag.text和Tag[‘属性名’]
我们用Tag.text提出Tag对象中的文字,用Tag[‘href’]提取出URL(即链接)。
把上面的代码改为:
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
# 把res的内容以字符串的形式返回
soup = BeautifulSoup( html,'html.parser')
# 把网页解析为BeautifulSoup对象
items = soup.find_all('div',class_='books') # 通过定位标签和属性提取我们想要的数据
for item in items:
kind = item.find('h2') # 在列表中的每个元素里,匹配标签<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) # 打印书籍的类型、名字、链接和简介的文字(.text针对文字;['herf'](即['属性名'])针对链接)
print('\n')
运行结果:
科幻小说
《奇点遗民》
https://book.douban.com/subject/27077140/
本书精选收录了刘宇昆的科幻佳作共22篇。《奇点遗民》融入了科幻艺术吸引人的几大元素:数字化生命、影像化记忆、人工智能、外星访客……刘宇昆的独特之处在于,他写的不是科幻探险或英雄奇幻,而是数据时代里每个人的生活和情感变化。透过这本书,我们看到的不仅是未来还有当下。
人文读物
《未来简史》
https://book.douban.com/subject/26943161/
未来,人类将面临着三大问题:生物本身就是算法,生命是不断处理数据的过程;意识与智能的分离;拥有大数据积累的外部环境将比我们自己更了解自己。如何看待这三大问题,以及如何采取应对措施,将直接影响着人类未来的发展。
技术参考
《利用Python进行数据分析》
https://book.douban.com/subject/25779298/
本书含有大量的实践案例,你将学会如何利用各种Python库(包括NumPy、pandas、matplotlib以及IPython等)高效地解决各式各样的数据分析问题。由于作者Wes McKinney是pandas库的主要作者,所以本书也可以作为利用Python实现数据密集型应用的科学计算实践指南。本书适合刚刚接触Python的分析人员以及刚刚接触科学计算的Python程序员。
以上就是如何用BeautifulSoup库的相关知识来解析和提取数据的基础知识。
总结:
BTW:
其实,在bs的官方文档中,find()与find_all()的方法,其实不止标签和属性两种,还有这些:
find(tag,attributes,recursive,text,keywords)
find_all(tag,attributes,recursive,text,limit,keywords)
tag——标签
attributes——属性
recursive——递推
text——文本
limit——限制
keywords——关键字
更多推荐


所有评论(0)