第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打印出的内容表面上看长得一模一样,却有着不同的内心,它们属于不同的类:<class 'str'> 与<class 'bs4.BeautifulSoup'>。前者是字符串,后者是已经被解析过的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()方法提取首个<div>元素,并放到变量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的数据类型

# 数据类型是<class 'bs4.element.ResultSet>, 前面说过可以把它当做列表list来看待。

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

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

for item in items:

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

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

    print(type(item))

我们看到它们的数据类型是<class 'bs4.element.Tag'>,是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')# 在列表中的每个元素里,匹配标签<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()也可以达到相同目的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容