【python爬虫】3.爬虫初体验(BeautifulSoup解析)

news2024/10/5 13:23:15

文章目录

  • 前言
  • BeautifulSoup是什么
  • BeautifulSoup怎么用
    • 解析数据
    • 提取数据
  • 对象的变化过程
  • 总结

前言

上一关,我们学习了HTML基础知识,知道了HTML是一种用来描述网页的语言,又了解了HTML的基本结构。
在这里插入图片描述
认识了HTML中的常见标签和常见属性:

在这里插入图片描述
在这里插入图片描述
根据这些知识,我们成功修改了这个网页上原来所显示标题——“这个书苑不太冷”,改成了“蜘蛛侠大战网页”。

在这里插入图片描述
最后,还写了这样一段代码:即通过调用requests库,获取到了网页源代码,并将它写入到本地:

# 调用requests模块
import requests
# 获取网页源代码,得到的res是response对象。
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html') 
# 检测请求是否正确响应
print(res.status_code) 

# 新建一个名为book的html文档,你看到这里的文件没加路径,它会被保存在程序运行的当前目录下。
# 字符串需要以w读写。你在学习open()函数时接触过它。
file = open('book.html','w')
# res.text是字符串格式,把它写入文件内。
file.write(res.text) 
# 关闭文件
file.close() 

今天这一关,如果用一句话来概括我们要学习的内容,那就是“品尝”一道美味的“浓汤” —— BeautifulSoup模块。

BeautifulSoup到底在爬虫中发挥着怎样的作用,能让我们单独拿出一个课程来学?一起来看看。

BeautifulSoup是什么

我们得先来回忆一下爬虫的四个步骤:
在这里插入图片描述
第0关的requests库帮我们搞定了爬虫第0步——获取数据;第1关的HTML知识,是进行爬虫必不可少的背景知识,能辅助我们解析和提取数据。

接下来,解析和提取的部分就交给灵活又方便的网页解析库BeautifulSoup。

那么,本关学习目标:学会使用BeautifulSoup解析和提取网页中的数据。

在这里插入图片描述
【解析数据】是什么意思呢?

我们平时使用浏览器上网,浏览器会把服务器返回来的HTML源代码翻译为我们能看懂的样子,之后我们才能在网页上做各种操作。

而在爬虫中,也要使用能读懂html的工具,才能提取到想要的数据。

在这里插入图片描述

这就是解析数据。

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

我还想提醒一下:解析与提取数据在爬虫中,既是一个重点,也是难点。因为这一关要讲两步,信息量会比之前两关大,所以希望你在学习的时候,能做好一定的心理准备,投入更多精力。

不过,我对你有信心。O(∩_∩)O

那么接下来,我们就来正式学习BeautifulSoup是如何解析和提取数据的吧~

BeautifulSoup怎么用

BeautifulSoup库目前已经进阶到第4版(Beautiful Soup 4),由于它不是Python标准库,而是第三方库,需要单独安装它,不过,我们的学习系统已经安装好了。

如果你是在自己的电脑上运行,需要在终端输入一行代码运行:pip install BeautifulSoup4。(Mac电脑需要输入pip3 install BeautifulSoup4)

安装好之后,就可以使用了。

解析数据

BeautifulSoup解析数据的用法很简单,请看下图:
在这里插入图片描述
在括号中,要输入两个参数,第1个参数是要被解析的文本,注意了,它必须必须必须是字符串。

括号中的第2个参数用来标识解析器,我们要用的是一个Python内置库:html.parser。(它不是唯一的解析器,却是简单的那个)

我们看看具体的用法。仍然以网站这个书苑不太冷为例(url:https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html),假设我们想爬取网页中的书籍类型、书名、链接、和书籍介绍。

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

# 调用requests库
import requests
# 获取网页源代码,得到的res是response对象
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html') 
# 检查请求是否正确响应
print(res.status_code)
# 把res的内容以字符串的形式返回
html = res.text 
# 打印html
print(html)

上面的代码是之前学过的内容,好,接下来就轮到BeautifulSoup登场解析数据了,请特别留意第3行和第6行新增的代码。

import requests
# 引入BS库,下面的bs4就是beautifulsoup4
from bs4 import BeautifulSoup
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
# 把网页解析为BeautifulSoup对象
soup = BeautifulSoup(res.text,'html.parser') 

第3行是引入BeautifulSoup库。

第6行中的第0个参数,必须是字符串类型;括号中的第1个参数是解析器。

这就是解析数据的用法。

接下来,我们来打印看看soup的数据类型,和soup本身(第5行开始为新增代码)。

import requests
from bs4 import BeautifulSoup
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html') 
soup = BeautifulSoup( res.text,'html.parser')
# 查看soup的类型
print(type(soup)) 
# 打印soup
print(soup) 

运行结果:

import requests
from bs4 import BeautifulSoup
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html') 
soup = BeautifulSoup( res.text,'html.parser')
# 查看soup的类型
print(type(soup)) 
# 打印soup
print(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库来提取数据,如果这不是一个BeautifulSoup对象,我们是没法调用相关的属性和方法的,所以,我们刚才写的代码是非常有用的,并不是重复劳动。

到这里,你就学会了使用BeautifulSoup去解析数据:

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

完成了爬虫的第1步:解析数据,下面就是爬虫的第2步:提取数据。

提取数据

我们仍然使用BeautifulSoup来提取数据。

这一步,又可以分为两部分知识:find()与find_all(),以及Tag对象(标签对象)。

在这里插入图片描述
先看find()与find_all()。

find()与find_all()是BeautifulSoup对象的两个方法,它们可以匹配html的标签和属性,把BeautifulSoup对象里符合要求的数据都提取出来。

它俩的用法是一样的,区别在于它们工作量。

find()只提取首个满足要求的数据。find()方法将代码从上往下找,找到符合条件的第一个数据,不管后面还有没有满足条件的其他数据,停止寻找,立即返回。

而find_all()顾名思义(find all:查找全部),提取出的是所有满足要求的数据。代码从上往下找,一直到代码的最后,把所有符合条件的数据揣好,一起打包返回。

在这里插入图片描述

看两个例子你就清楚了。以这个网页为例(URL: https://localprod.pandateacher.com/python-manuscript/crawler-html/spder-men0.0.html):

在这里插入图片描述

在网页的HTML代码中,有三个div元素(

),用find()可以提取出首个元素(只有一个),而find_all()可以全部取出(三个)。

看代码(第7行为新增代码),然后尝试运行,查看结果:

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')
# 使用find()方法提取首个<div>元素,并放到变量item里。
item = soup.find('div') 
# 打印item的数据类型
print(type(item))
# 打印item  
print(item)       

运行结果:

200
<class 'bs4.element.Tag'>
<div>大家好,我是一个块</div>

看,运行结果正是首个div元素吧!我们还打印了它的数据类型:<class ‘bs4.element.Tag’>,说明这是一个Tag类标签对象。

再来试试find_all()吧,它可以提取出网页中的全部div元素(3个),请看代码(第7行为新增代码),然后点击运行。

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')
# 用find_all()把所有符合要求的数据提取出来,并放在变量items里
items = soup.find_all('div') 
# 打印items的数据类型
print(type(items)) 
# 打印items
print(items)       

运行结果:

200
<class 'bs4.element.ResultSet'>
[<div>大家好,我是一个块</div>, <div>我也是一个块</div>, <div>我还是一个块</div>]

运行结果是那三个div元素,它们一起组成了一个列表结构。打印items的类型,显示的是<class ‘bs4.element.ResultSet’>,是一个ResultSet类的对象。其实是Tag对象以列表结构储存了起来,可以把它当做列表来处理。

下面,我想强调一下它们用法中的两个要点:

在这里插入图片描述
首先,请看举例中括号里的class_,这里有一个下划线,是为了和python语法中的类 class区分,避免程序冲突。当然,除了用class属性去匹配,还可以使用其它属性,比如style属性等。

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

如果只用其中一个参数就可以准确定位的话,就只用一个参数检索。如果需要标签和属性同时满足的情况下才能准确定位到我们想找的内容,那就两个参数一起使用。

再次总结一下find()与find_all()的用法:

在这里插入图片描述
这么多的内容,不太可能一下就记住,要想熟练使用,还需要大量练习。那么现在我们就来做个小练习吧,仍然以网站这个书苑不太冷为例:

(url:https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html),目标是爬取网页中的三本书的书名、链接、和书籍介绍。

打开网址,在网页上点击右键-检查,查看源代码,先看一看目标数据所对应的位置。

在这里插入图片描述

滑动一下网页,看见我们想要的每一本书的数据,分别存在了三个div元素中,并且有相同的属性:class=“books”,这个共同点就是我们去提取数据的关键。

我们可以先把这三个div元素提取出来,然后再进一步提取那些具体的书的类型、书名等等。

由于我们要找的不是一本书的数据,而是所有书的数据都要找,所以这时应该用find_all()。

接下来要考虑的就是,要用什么参数去查找和定位,标签,还是属性。此时,可以用到开发者工具的搜索功能,点击Ctrl+F,Mac电脑用command+F。

在搜索栏中输入div试试,搜索结果是:

在这里插入图片描述
一共找到了8个div元素,但我们只想找到3个,如果只用

来检索,就会把其它不需要的信息也提取出来。那有没有什么别的识别这3个div元素的方法呢?

有!还记得我们上节课提到的class元素吗,不同元素之间复用同一套样式,只需要给标签设置同一个class值就好了。而这三个设计书籍信息的div样式很显然是一样的,class值都为books。

我们用属性class="books"搜索看看,果然,整个HTML源代码中,只有我们要找的三个元素的属性满足,因此,我们这次就可以只使用这个属性来提取。

在这里插入图片描述

(注:点击右键-显示网页源代码,在这个页面里去搜索会更加准确,在这里我们是点击右键-检查,在这个页面里去搜索的)

现在,来看看代码怎么写,再点击运行:

# 调用requests库
import requests
# 调用BeautifulSoup库 
from bs4 import BeautifulSoup 
# 返回一个Response对象,赋值给res
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
# 把Response对象的内容以字符串的形式返回
html = res.text
# 把网页解析为BeautifulSoup对象
soup = BeautifulSoup( html,'html.parser') 
# 通过匹配标签和属性提取我们想要的数据
items = soup.find_all(class_='books') 
# 打印items
print(items) 
# 打印items的数据类型
print(type(items)) 

运行结果:

[<div class="books">
<h2><a name="type1">科幻小说</a></h2>
<a class="title" href="https://book.douban.com/subject/27077140/">《奇点遗民》</a>
<p class="info">本书精选收录了刘宇昆的科幻佳作共22篇。《奇点遗民》融入了科幻艺术吸引人的几大元素:数字化生命、影像化记忆、人工智能、外星访客……刘宇昆的独特之处在于,他写的不是科幻探险或英雄奇幻,而是数据时代里每个人的生活和情感变化。透过这本书,我们看到的不仅是未来还有当下。</p>
<img class="img" src="./spider-men5.0_files/s29492583.jpg"/>
<br>
<br>
<hr size="1"/>
</br></br></div>, <div class="books">
<h2><a name="type2">人文读物</a></h2>
<a class="title" href="https://book.douban.com/subject/26943161/">《未来简史》</a>
<p class="info">未来,人类将面临着三大问题:生物本身就是算法,生命是不断处理数据的过程;意识与智能的分离;拥有大数据积累的外部环境将比我们自己更了解自己。如何看待这三大问题,以及如何采取应对措施,将直接影响着人类未来的发展。</p>
<img class="img" src="./spider-men5.0_files/s29287103.jpg"/>
<br>
<br/>
<hr size="1"/>
</br></div>, <div class="books">
<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>
<img class="img" src="./spider-men5.0_files/s27275372.jpg"/>
<br/>
<br/>
<hr size="1"/>
</div>]
<class 'bs4.element.ResultSet'>

现在,三本书的全部信息都被我们提取出来了。它的数据类型是<class ‘bs4.element.ResultSet’>, 前面说过可以把它当做列表list来看待。

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

用for循环遍历列表,就可以把这三个div元素取出来了。

请仔细阅读代码,然后点运行看看:

# 调用requests库
import requests 
# 调用BeautifulSoup库
from bs4 import BeautifulSoup 
# 返回一个Response对象,赋值给res
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
# 把Response对象的内容以字符串的形式返回
html= res.text
# 把网页解析为BeautifulSoup对象
soup = BeautifulSoup( html,'html.parser') 
# 通过定位标签和属性提取我们想要的数据
items = soup.find_all(class_='books') 
for item in items:
    # 打印item
    print('想找的数据都包含在这里了:\n',item) 

运行结果:

想找的数据都包含在这里了:
 <div class="books">
<h2><a name="type1">科幻小说</a></h2>
<a class="title" href="https://book.douban.com/subject/27077140/">《奇点遗民》</a>
<p class="info">本书精选收录了刘宇昆的科幻佳作共22篇。《奇点遗民》融入了科幻艺术吸引人的几大元素:数字化生命、影像化记忆、人工智能、外星访客……刘宇昆的独特之处在于,他写的不是科幻探险或英雄奇幻,而是数据时代里每个人的生活和情感变化。透过这本书,我们看到的不仅是未来还有当下。</p>
<img class="img" src="./spider-men5.0_files/s29492583.jpg"/>
<br>
<br>
<hr size="1"/>
</br></br></div>
想找的数据都包含在这里了:
 <div class="books">
<h2><a name="type2">人文读物</a></h2>
<a class="title" href="https://book.douban.com/subject/26943161/">《未来简史》</a>
<p class="info">未来,人类将面临着三大问题:生物本身就是算法,生命是不断处理数据ç
                               过程;意识与智能的分离;拥有大数据积累的外部环境将比我们自己更了解自己。如何看待这三大问题,以及如何采取应对措施,将直接影响着人类未来的发展。</p>
<img class="img" src="./spider-men5.0_files/s29287103.jpg"/>
<br>
<br/>
<hr size="1"/>
</br></div>
想找的数据都包含在这里了:
 <div class="books">
<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>
<img class="img" src="./spider-men5.0_files/s27275372.jpg"/>
<br/>
<br/>
<hr size="1"/>
</div>

程序运行很顺利,结果正是那三个div元素。

其实到这里,find()和find_all()的用法讲了,练习也做了,但是,我们现在打印出来的东西还不是目标数据,里面含着HTML标签,所以下面,我们要进入到提取数据中的另一个知识点——Tag对象。

在这里插入图片描述
咱们还以上面的代码为例,我们现在拿到的是一个个包含html标签的数据,还没达成目标。

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

好,来打印一下:

# 调用requests库
import requests 
# 调用BeautifulSoup库
from bs4 import BeautifulSoup 
# 返回一个response对象,赋值给res
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html') 
# 把res的内容以字符串的形式返回
html = res.text
# 把网页解析为BeautifulSoup对象
soup = BeautifulSoup( html,'html.parser') 
# 通过定位标签和属性提取我们想要的数据
items = soup.find_all(class_='books') 
for item in items:
    # 打印item
    print('想找的数据都包含在这里了:\n',item) 
    print(type(item))

运行结果:

想找的数据都包含在这里了:
 <div class="books">
<h2><a name="type1">科幻小说</a></h2>
<a class="title" href="https://book.douban.com/subject/27077140/">《奇点遗民》</a>
<p class="info">本书精选收录了刘宇昆的科幻佳作共22篇。《奇点遗民》融入了科幻艺术吸引人的几大元素:数字化生命、影像化记忆、人工智能、外星访客……刘宇昆的独特之处在于,他写的不是科幻探险或英雄奇幻,而是数据时代里每个人的生活和情感变化。透过这本书,我们看到的不仅是未来还有当下。</p>
<img class="img" src="./spider-men5.0_files/s29492583.jpg"/>
<br>
<br>
<hr size="1"/>
</br></br></div>
<class 'bs4.element.Tag'>
想找的数据都包含在这里了:
 <div class="books">
<h2><a name="type2">人文读物</a></h2>
<a class="title" href="https://book.douban.com/subject/26943161/">《未来简史》</a>
<p class="info">未来,人类将面临着三大问题:生物本身就是算法,ç是不断处理数据的过程;意识与智能的分离;拥有大数据积累的外部环境将比我们自己更了解自己。如何看待这三大问题,以及如何采取应对措施,将直接影响着人类未来的发展。</p>
<img class="img" src="./spider-men5.0_files/s29287103.jpg"/>
<br>
<br/>
<hr size="1"/>
</br></div>
<class 'bs4.element.Tag'>
想找的数据都包含在这里了:
 <div class="books">
<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>
<img class="img" src="./spider-men5.0_files/s27275372.jpg"/>
<br/>
<br/>
<hr size="1"/>
</div>
<class 'bs4.element.Tag'>

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

好,既然知道了是Tag对象,下一步,就是看看Tag类对象的常用属性和方法了。

在这里插入图片描述
上图是Tag对象的3种用法,咱们一个一个来讲。

首先,Tag对象可以使用find()与find_all()来继续检索。

回到我们刚刚写的代码:即爬取这个书苑不太冷网站中每本书的类型、链接、标题和简介,我们刚刚拿到的分别是三本书的内容,即三个Tag对象。现在,先把首个Tag对象展示在下面,方便我们阅读:

<div class="books">
    <h2><a name="type1">科幻小说</a></h2>
    <a href="https://book.douban.com/subject/27077140/" class="title">《奇点遗民》</a>
    <p class="info">本书精选收录了刘宇昆的科幻佳作共22篇。《奇点遗民》融入了科幻艺术吸引人的几大元素:数字化生命、影像化记忆、人工智能、外星访客……刘宇昆的独特之处在于,他写的不是科幻探险或英雄奇幻,而是数据时代里每个人的生活和情感变化。透过这本书,我们看到的不仅是未来还有当下。
    </p> 
    <img class="img" src="./spider-men5.0_files/s29492583.jpg">
    <br>
    <br>
    <hr size="1">
</div>

看第2行:书籍的类型在这里面;第3行:我们要取的链接和书名在里面;第4行:书籍的简介在里面。因为是只取首个数据,这次用find()就好。

先阅读下面的代码(从11行开始为新增代码):

# 调用requests库
import requests 
# 调用BeautifulSoup库
from bs4 import BeautifulSoup 
# 返回一个response对象,赋值给res
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
# 把res的内容以字符串的形式返回
html = res.text
# 把网页解析为BeautifulSoup对象
soup = BeautifulSoup( html,'html.parser') 
# 通过定位标签和属性提取我们想要的数据
items = soup.find_all(class_='books') 
for item in items:
    # 在列表中的每个元素里,匹配标签<h2>提取出数据
    kind = item.find('h2') 
    # 在列表中的每个元素里,匹配属性class_='title'提取出数据
    title = item.find(class_='title')
    # 在列表中的每个元素里,匹配属性class_='info'提取出数据 
    brief = item.find(class_='info') 
    # 打印提取出的数据
    print(kind,'\n',title,'\n',brief) 
    # 打印提取出的数据类型
    print(type(kind),type(title),type(brief)) 

接下来,请你抄写上面的代码,然后点击运行,练习一下。
运行结果:

<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'>

除了我们拿到的数据之外;运行结果的数据类型,又是三个<class ‘bs4.element.Tag’>,用find()提取出来的数据类型和刚才一样,还是Tag对象。接下来要做的,就是把Tag对象中的文本内容提出来。

这时,可以用到Tag对象的另外两种属性——Tag.text(获得标签中的值),和Tag[‘属性名’](获得属性值)。

在这里插入图片描述
我们用Tag.text提出Tag对象中的文字,用Tag[‘href’]提取出URL。

只需要修改最后一行代码,我们想要的数据就都能成功提取出来了:

# 调用requests库
import requests 
# 调用BeautifulSoup库
from bs4 import BeautifulSoup 
# 返回一个response对象,赋值给res
res =requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
# 把res解析为字符串
html=res.text
# 把网页解析为BeautifulSoup对象
soup = BeautifulSoup( html,'html.parser')
# 通过匹配属性class='books'提取出我们想要的元素
items = soup.find_all(class_='books')  
# 遍历列表items
for item in items:       
    # 在列表中的每个元素里,匹配标签<h2>提取出数据               
    kind = item.find('h2')     
    #  在列表中的每个元素里,匹配属性class_='title'提取出数据          
    title = item.find(class_='title')  
    # 在列表中的每个元素里,匹配属性class_='info'提取出数据   
    brief = item.find(class_='info')      
    # 打印书籍的类型、名字、链接和简介的文字
    print(kind.text,'\n',title.text,'\n',title['href'],'\n',brief.text) 

看看终端,拿出来啦(≧▽≦)/此处应该有掌声,到这里,我们终于成功解析、提取到了所有的数据。
运行结果:

科幻小说 
 《奇点遗民》 
 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库的相关知识来解析和提取数据。面对这扑面而来的新的知识,我们有必要来梳理一下:

对象的变化过程

其实说白了,从最开始用requests库获取数据,到用BeautifulSoup库来解析数据,再继续用BeautifulSoup库提取数据,不断经历的是我们操作对象的类型转换。

请看下图:

在这里插入图片描述

上一关,我们的操作对象从URL链接到了Response对象。而这一关,我们的操作对象是这样的:Response对象——字符串——BS对象。到这里,又产生了两条分岔:一条是BS对象——Tag对象;另一条是BS对象——列表——Tag对象。

而操作对象的转变,则是借由一些步骤完成的,在图中是由阿拉伯数字标注的内容:从Response对象到字符串,是通过response.text完成的,我就不赘述了,图上标示得很清楚。

在此刻,我尤其想要强调的是,学到现在的你炒鸡棒的,b( ̄▽ ̄)d,而你记不全这些内容太太太正常了,因为编程从来都是一门强调实操实练的学科。

好,现在想请屏幕前的你深吸一口气,在椅子上一定坐稳了,千万不要晕倒,因为我对你隐瞒了一件事。

其实刚刚那个图还不完整,完整版的图示是这样的:

在这里插入图片描述
Python是一门面向对象编程的过程,图中用英文字母的序号来展示的是每一种对象的方法和属性。比如bs对象的方法有find()和find_all()。我也不赘述了。

这个流程其实对应的是爬虫四步的前3步:

在这里插入图片描述

这张图还挺重要的,可以作为你做练习、复习的一个关键参考信息。❀

不过梳理完之后,我们还是得来敲敲代码,光看不练可不行。所以,学完知识之后不只要去写作业,最好把本关的的代码全部再写一次,因为学习可是需要我们付出努力的噢。

总结

又到了一个关卡快要结束的时刻了。快速复习一下:

我们今天学习了用bs库解析数据和提取数据。

解析数据的方法是用BeautifulSoup()。

在这里插入图片描述

提取数据的方法是用find()与find_all()。

在这里插入图片描述
在这里插入图片描述
这一关中,除了学这些零碎的知识,最重要的是,我们要把所学的知识串成一条线:

在这里插入图片描述
这就是本关的全部内容了。

最后,我还想多说几句。在BeautifulSoup中,不止find()和find_all(),还有select()也可以达到相同目的。

其实,在bs的官方文档中,find()与find_all()的方法,其实不止标签和属性两种,还有这些:

在这里插入图片描述
不过,我们所教的这两种方法,足以胜任你的95%以上的html解析提取问题,以及风变编程中所有html解析与提取的问题。

为什么我不把所有知识都讲给你,因为,学BeautifulSoup就可能需要好多个关卡了,我们的目的只是带领你走一条快速入门的路。

学无止境,当这些知识都被你掌握,而且练习了更多的项目之后,就有余力去自学和拓展更多的知识了。

即便我只是挑了重点之中的重点为你讲解解析数据的方法,这一关的知识量还是有些大,在学完这个关卡之后,你必须再回过头复习一遍,这对你去理解和记忆这些知识,是相当有帮助的。

通过这一关的学习,你就搞明白了用bs库解析数据和提取数据的方法,只要数据在html里,你都可以拿到了。

下一关,我们会进行BeautifulSoup库的相关实操,务求咱们把所学的都用好~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/952701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

A系统跳转到B系统URl传参与接收

处理url字符串拼接方法new URLSearchParams() A系统 let data { study_id: row.study_id, hospital_id: row.hospital_id, pageType: detail };let params new URLSearchParams(); for (let key in data) {params.append(key, data[key]); } window.open(url ? params.toS…

SpringCloud(十)——ElasticSearch简单了解(二)DSL查询语句及RestClient查询文档

文章目录 1. DSL查询文档1.1 DSL查询分类1.2 全文检索查询1.3 精确查询1.4 地理查询1.5 查询算分1.6 布尔查询1.7 结果排序1.8 分页查询1.9 高亮显示 2. RestClient查询文档2.1 查询全部2.2 其他查询语句2.3 排序和分页2.4 高亮显示 1. DSL查询文档 1.1 DSL查询分类 查询所有…

中央仓库更新失败,IDEA报错repository is non-nexus repo, or does not indexed

某个仓库未被识别为 Nexus 仓库&#xff0c;或者没有被正确地索引。导致引入依赖一直爆红&#xff0c;找不到。只有本地仓库的依赖没报错&#xff0c;因为下载过了&#xff0c;添加新的依赖就需要到远程仓库找就爆红。 解决 去阿里云Maven官网看了一下&#xff0c;发现阿里云…

详解 SpringMVC 中获取请求参数

文章目录 1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、[RequestParam ](/RequestParam )4、[RequestHeader ](/RequestHeader )5、[CookieValue ](/CookieValue )6、通过POJO获取请求参数7、解决获取请求参数的乱码问题总结 在Spring MVC中&#xff0c;获取请…

前后端项目部署上线详细笔记

部署 参考文章&#xff1a;如何部署网站&#xff1f;来比比谁的方法多 - 哔哩哔哩大家好&#xff0c;我是鱼皮&#xff0c;不知道朋友们有没有试着部署过自己开发的网站呢&#xff1f;其实部署网站非常简单&#xff0c;而且有非常多的花样。这篇文章就给大家分享几种主流的前端…

自编码器AE全方位探析:构建、训练、推理与多平台部署

本文深入探讨了自编码器&#xff08;AE&#xff09;的核心概念、类型、应用场景及实战演示。通过理论分析和实践结合&#xff0c;我们详细解释了自动编码器的工作原理和数学基础&#xff0c;并通过具体代码示例展示了从模型构建、训练到多平台推理部署的全过程。 关注TechLead&…

软件测试/测试开发丨Python 学习笔记 之 链表

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/26458 链表与数组的区别 复杂度分析 时间复杂度数组链表插入删除O(n)O(1)随机访问O(1)O(n) 其他角度分析 内存连续&#xff0c;利用CPU的机制&#xff0…

上海炒股开户哪个证券公司好?找谁能开低佣金的账户?

在上海炒股开户选择哪家券商都可以&#xff0c;但是要拿到低佣金的账户就有点难度了。上海&#xff0c;简称“沪&#xff0c;是国务院批复确定的中国国际经济、金融、贸易、航运、科技创新中心&#xff01;正是如此&#xff0c;上海地区的券商公司也是非常之多的&#xff0c;这…

centos安装jdk-8u371-linux-x64.tar.gz包

java -version //查看jdk版本 rpm -qa | grep jdk 删除带有"openjdk"字样的jdk 例: rpm -e --nodeps java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64 下载该版本的jdk(jdk-8u371-linux-x64.tar.gz) (https://www.oracle.com/java/technologies/javase/javase8u2…

AI:04-基于机器学习的蘑菇分类

蘑菇是一类广泛分布的真菌,其中许多种类具有重要的食用和药用价值,但也存在着一些有毒蘑菇。因此,准确地区分可食用和有毒的蘑菇对于保障人们的食品安全和健康至关重要。本研究旨在基于机器学习技术开发一种蘑菇分类系统,以实现对蘑菇的自动分类和识别。通过构建合适的数据…

8年经验之谈 —— 如何用 JMeter 编写性能测试脚本?

Apache JMeter 应该是应用最广泛的性能测试工具。怎么用 JMeter 编写性能测试脚本&#xff1f; 1. 编写 HTTP 性能测试脚本 STEP 1. 添加 HTTP 请求 i STEP 2. 了解配置信息 HTTP 请求各项信息说明&#xff08;以 JMeter 5.1 为例&#xff09;。 如下图所示&#xff1a; W…

MindsDB为许多不支持内置机器学习的数据库带来了机器学习功能

选择平台的首要原则是“靠近数据”,让代码靠近数据是保持低延迟的必要条件。 机器学习,特别是深度学习往往会多次遍历所有数据(遍历一次被称为一个epoch)。对于非常大的数据集来说,理想的情况是在存储数据的地方建立模型,这样就不需要大量的数据传输。目前已经有部分数据…

如何基于CEETRON ENVISON快速打造桌面、Web端仿真后处理系统?

数十年来&#xff0c;计算机数字模拟技术在物理、化学、工程等领域取得巨大进展。但实现完整的数字孪生 以模拟现实&#xff0c;仍需应对高维度、高精度建模的挑战以及计算机算力需求指数的增长。那该如何解决 这些更复杂的问题&#xff1f;采用具有高性能算力的云端资源进行…

【单片机】有人 WH-LTE-7S1 4G cat1 模块,HTTPD模式,字符串传输,文件传输。GPRS模块连接服务器教程。

文章目录 1、配置模块为HTTPD模式 POST字符串传输2、配置模块为HTTPD模式 GET请求3、 上一篇文章&#xff1a;https://qq742971636.blog.csdn.net/article/details/132571592 在上一篇文章里&#xff0c;已经通过TCP 长链接进行服务器与Cat1 GPRS 模块进行双向通信。已经能够满…

【Pinia状态管理】Pinia和Vuex的对比;创建Pinia的Store;Pinia核心概念State、Getters、Actions

目录 1_Pinia和Vuex的对比1.1_介绍pinia1.2_Pinia和Vuex的区别 2_创建Pinia的Store2.1_安装使用2.2_Store2.3_定义一个Store 3_Pinia核心概念State3.1_认识和定义State3.2_操作State 4_Pinia核心概念Getters4.1_认识2.2_访问Getters 5_Pinia核心概念Actions5.1_认识5.2_Actions…

Nat. Mach. Intell 2023 | DrugBAN+:域自适应的可解释双线性插值网络改进药物-靶标预测(DTI)

DrugBAN&#xff1a;Interpretable bilinear attention network with domain adaptation improves drug–target prediction 论文&#xff1a;Interpretable bilinear attention network with domain adaptation improves drug–target prediction | Nature Machine Intellige…

Python爬虫基础之正则表达式

目录 一、什么是正则表达式&#xff1f; 二、re.compile()编译函数 三、group()获取匹配结果函数 四、常用匹配规则 4.1匹配单个字符 4.2匹配前字符次数 4.3匹配原生字符串 4.4匹配字符串开头和结尾 4.5分组匹配 五、re.match()开头匹配函数 六、re.search()全文搜索…

MusicBrainz Picard for Mac :音乐文件ID3编辑器

MusicBrainz Picard for Mac是一款macOS平台的音乐文件ID3编辑器&#xff0c;能够帮助我们在Mac电脑上编辑音乐文件的ID3标签信息&#xff0c;包括艺人、专辑等信息&#xff0c;非常快速和简单方便。Picard是下一代MusicBrainz标记应用程序。 这个新的标签概念是面向专辑的&…

Socks5代理 vs. Socks4代理:特点和区别解析

在网络通信中&#xff0c;使用代理服务器可以提供更安全、匿名的连接。其中&#xff0c;Socks5和Socks4是两种常见的代理协议。本文将深入探讨它们之间的特点和区别&#xff0c;帮助您选择适合自己需求的代理类型。 1.特点概述 -Socks5&#xff08;Socket Secure 5&#xff0…