BeautifulSoup

处理数据我们需要用到一个强大的第三方库——BeautifulSoup

处理数据分为两步:解析数据 和 提取数据,解析数据指将网页源代码解析成 Python 能“读懂”的格式,而提取数据则是指将网页源代码中无关数据过滤掉,只提取出我们所需要的数据。

解析数据

我们以豆瓣读书 Top250 为例,它的网址是:sjihttps://book.douban.com/top250。

我们来看看如何将其网页源代码解析成 BeautifulSoup 对象:

import requests

from bs4 import BeautifulSoup

headers = {

'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'

}

res = requests.get('https://book.douban.com/top250', headers=headers)

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

我们通过 from bs4 import BeautifulSoup 语句导入 BeautifulSoup,然后使用 BeautifulSoup(res.text, 'html.parser') 语句将网页源代码的字符串形式解析成了 BeautifulSoup 对象。

创建 BeautifulSoup 对象时需要传入两个参数,第一个参数是要解析的 HTML 文本,即网站源代码的字符串形式(res.text)。第二个参数是解析 HTML 的解析器,html.parser 是 Python 中内置的解析器,较为简单方便。

res.text 的类型是字符串,而 soup 的类型是 BeautifulSoup 对象,它俩是完全不同的东西。相比字符串,BeautifulSoup 对象 里有很多强大的方法和属性。通过这些方法和属性,我们就能方便快捷地提取出我们所需要的数据。

提取数据

find() 方法和 find_all() 方法

find():找到符合条件的首个数据

find_all():找到符合条件的所有数据

登录/注册

豆瓣读书 Top 250

豆瓣电影

追风筝的人

解忧杂货店

小王子

注意对比两个输出结果的差异:

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

print(soup.find('a'))

# 输出:登录/注册

print(soup.find_all('a'))

# 输出:[

# 登录/注册,

# 豆瓣电影,

# 追风筝的人,

# 解忧杂货店,

# 小王子

# ]

上面代码中使用 find() 和 find_all() 方法分别提取了 a 标签 的内容。可以看到,find() 方法返回了第一个 a 标签,而 find_all() 方法则返回了所有的 a 标签。

它俩的用法基本一样,都是传入 HTML 标签名称,返回符合该 HTML 标签的数据。区别是 find() 方法只返回第一个符合条件的标签,而 find_all() 方法返回所有符合条件的标签列表。我想你从它俩的名字中便能领会到这个区别。

除了传入 HTML 标签名称 外,这两个方法还支持传入 HTML 属性 进行筛选,返回符合条件的数据。举个例子:

# 查找 id='doubanapp-tip' 的 div 标签

soup.find('div', id='doubanapp-tip')

# 查找所有 class='rating_nums' 的 span 标签

soup.find_all('span', class_='rating_nums')

Tips:因为 class 是 Python 中定义类的关键字,因此用 class_ 表示 HTML 中的 class。

Tag 对象

BeautifulSoup 将 HTML 中的元素封装成了 Tag 对象。和 BeautifulSoup 对象 一样,Tag 对象 里也有 find() 和 find_all() 方法。因此,我们可以不断地调用这两个方法,一层一层地找到我们需要的数据。我们还是以前面的 HTML 代码为例提取其中的书名:

登录/注册

豆瓣读书 Top 250

豆瓣电影

追风筝的人

解忧杂货店

小王子

我们可以看到,书名在 a 标签 中。但如果直接使用 soup.find_all('a') 的话,第二行的“登录/注册”和第五行的“豆瓣电影”也会被获取到,因此我们需要将这些无效数据过滤掉。

我们分析一下不难发现,书名在 class="item" 的 div 标签 里的 a 标签 内。我们只要先找到所有 class="item" 的 div 标签,然后再找到其中的 a 标签 即可,因此我们可以像下面这样来获取书名的数据:

# 找到所有 class_='item' 的 div 标签

items = soup.find_all('div', class_='item')

for i in items:

# 找到 class_='item' 的 div 标签中的 a 标签

print(i.find('a'))

# 输出:

# 追风筝的人

# 解忧杂货店

# 小王子

这样,我们就找到了所有书名的数据。此时返回的还是 Tag 对象。如果我们只想要书名和对应的链接呢?这就用到了 Tag 对象 的 text 属性和 HTML 属性名取值。

items = soup.find_all('div', class_='item')

for i in items:

tag = i.find('a')

# 获取 text 属性

name = tag.text

# 获取 href 属性值

link = tag['href']

print(name, link)

# 输出:

# 追风筝的人 https://book.douban.com/subject/1770782/

# 解忧杂货店 https://book.douban.com/subject/25862578/

# 小王子 https://book.douban.com/subject/1084336/

我们通过 Tag 对象 的 text 属性拿到了 a 标签里的文字内容,即 追风筝的人 等。然后我们通过和字典取值一样的方式,将 HTML 属性名 作为键,得到了对应属性的值。这里是以 href 属性为例,其他的 HTML 属性也同样可以。

我们来总结一下 Tag 对象 的常用属性和方法:

tag.find:返回符合条件的首个数据

tag.find_all:返回符合条件的所有数据

tag.text:获取标签的文本内容

tag['属性名']:获取HTML标签属性的值

我们通过多次调用 find() 或 find_all() 方法一层层地找到了我们需要的数据。你可能会问,有没有什么方法可以直接就找到我们需要的数据,而不用多次查找吗?

答案是肯定的,需要用到 CSS 选择器

from bs4 import BeautifulSoup

html = '''

小王子

追风筝的人

'''

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

print(soup.select('.item.book'))

# 输出:[]

print(soup.select('.item .book'))

# 输出:[

小王子

,

追风筝的人

]

print(soup.select('.item > .book'))

# 输出:[

小王子

]

BeautifulSoup 对象 有一个 select() 方法,我们将 CSS 选择器 传进去即可直接找到我们需要的元素。上面查找在 class="item" 的 div 标签里的a标签的代码就可以这样写:

items = soup.select('div.item a')

for i in items:

name = i.text

link = i['href']

print(name, link)

# 输出:

# 追风筝的人 https://book.douban.com/subject/1770782/

# 解忧杂货店 https://book.douban.com/subject/25862578/

# 小王子 https://book.douban.com/subject/1084336/

编程练习

讲解中的例子是简化过后的豆瓣读书网页源代码,接下来我们实战一下。

打开 https://book.douban.com/top250,分析它的网页源代码,用我们学过的知识点提取出书名和对应的链接。

import requests

from bs4 import BeautifulSoup

headers = {

'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'

}

res = requests.get('https://book.douban.com/top250', headers=headers)

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

items = soup.find_all('div', class_='pl2')

for i in items:

tag = i.find('a')

name = tag['title']

link = tag['href']

print(name, link)

先,使用 requests 获取了网页源代码,然后将网页源代码的字符串形式通过 BeautifulSoup 解析成了 BeautifulSoup 对象,接着我们通过 BeautifulSoup 对象 的 find() 和 find_all() 方法查找我们需要的数据。

当我们需要的数据无法一次查找到时,我们需要多次调用 find() 和 find_all() 方法来一层层查找。找到需要的数据后,就可以调用 tag.text 或 tag['属性名'] 提取到我们需要的部分了。

我们通过 ''.join(tag.text.split()) 将内容按空格符(包括空格、换行符等)分隔再拼接,这样就去除了所有的空格符。

python爬虫分析数据_Python爬虫入门 处理数据相关推荐

  1. python唐诗分析综合_Python爬虫抓取唐诗宋词

    一 说明 Python语言的爬虫开发相对于其他编程语言是极其高校的,在上一篇文章 爬虫抓取博客园前10页标题带有Python关键字(不区分大小写) 的文章中,我们介绍了使用requests做爬虫开发, ...

  2. python编程理论篇_Python爬虫入门实战之猫眼电影数据抓取(理论篇)

    前言 本文可能篇幅较长,但是绝对干货满满,提供了大量的学习资源和途径.达到让读者独立自主的编写基础网络爬虫的目标,这也是本文的主旨,输出有价值能够真正帮助到读者的知识,即授人以鱼不如授人以渔,让我们直 ...

  3. python爬取去哪网数据_Python爬虫入门:使用Python爬取网络数据

    1 网络爬虫 引用百度百科的定义:网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 简单的说,就是有一个程序可以自动去访问网页. 2 Python爬虫 如何实现爬虫? 简单的讲,一共 ...

  4. python爬虫天气数据_python爬虫:天气数据的分析

    就在前几天还是二十多度的舒适温度,今天一下子就变成了个位数,小编已经感受到冬天寒风的无情了.之前对获取天气都是数据上的搜集,做成了一个数据表后,对温度变化的感知并不直观.那么,我们能不能用python ...

  5. python爬虫和医学数据_Python爬虫入门教程 24-100 微医挂号网医生数据抓取

    1. 微医挂号网医生数据写在前面 今天要抓取的一个网站叫做微医网站,地址为 https://www.guahao.com ,我们将通过python3爬虫抓取这个网址,然后数据存储到CSV里面,为后面的 ...

  6. python爬虫自学路线_python 爬虫学习路线:从入门到进阶

    大家好,我是凉拌 今天给大家详解一下我的爬虫学习路线. 对于小白来说,爬虫可能是一件非常复杂.技术门槛很高的事情.比如有的人则认为先要掌握网页的知识,遂开始 HTML\CSS,结果入了前端的坑,浪费了 ...

  7. python爬虫知识大全_Python爬虫入门有哪些基础知识点

    1.什么是爬虫 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来.想抓取什么?这个由你来控制它咯. ...

  8. python爬虫文献综述_Python爬虫入门(1):综述

    首先爬虫是什么?网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 根据我的经验,要学习Python爬虫, ...

  9. python爬虫文献综述_Python爬虫入门一之综述

    大家好哈,最近博主在学习Python,学习期间也遇到一些问题,获得了一些经验,在此将自己的学习系统地整理下来,如果大家有兴趣学习爬虫的话,可以将这些文章作为参考,也欢迎大家一共分享学习经验. Pyth ...

  10. python爬虫电影信息_Python爬虫入门 | 爬取豆瓣电影信息

    这是一个适用于小白的Python爬虫免费教学课程,只有7节,让零基础的你初步了解爬虫,跟着课程内容能自己爬取资源.看着文章,打开电脑动手实践,平均45分钟就能学完一节,如果你愿意,今天内你就可以迈入爬 ...

最新文章

  1. php mysql设置null,MySQL和PHP – 插入NULL而不是空string
  2. VTK:可视化之Glyph3DImage
  3. linux手动注入网络数据_Linux网络 - 数据包的接收过程
  4. dlgdata.cpp错误提示 解决方案
  5. STM32那点事(2)_时钟树(下)
  6. transform()
  7. .Net Core报“‘GB2312‘ is not a supported encoding name. For information on defining a custom encod”的错误
  8. python判断整数是否对称_刷题系列 - Python判断是否镜像对称二叉树
  9. 注册测绘师 案例分析
  10. JAVA面试宝典2018-2019
  11. matlab算方差std,MATLAB 方差函数 var std
  12. 认识心理学上的自我界限(学习记录)
  13. 交互设计、信息图、信息可视化、数据可视化技术资源汇总——设计师的领域,设计师说了算
  14. 拼多多开店有哪些优势?
  15. 【组合数学】通俗解释 Burnside引理和Polya定理
  16. 遍历$.each()和$().each()用法
  17. DNS篇之DNS协议详解
  18. java小项目家庭记账程序
  19. Prism.Wpf框架中WindowStartupLocation的问题
  20. e换电受邀参加上海电动自行车集中充电设备展示推荐会

热门文章

  1. Docker Compose学习之docker-compose.yml编写规则 及 实战案例
  2. webstrom 开发工具简介
  3. 【Java】我的第一个 JAVA 程序:Hello,world!
  4. react 生命挂钩_角生命周期挂钩:ngOnChanges,ngOnInit等
  5. 状态模式 有限状态机_有限状态机解释
  6. 游戏窗口组合键消息失败_5失败的投资组合,以后我在这里
  7. ntko web firefox跨浏览器插件_Firefox火狐浏览器插件全部失效解决方法
  8. Python玩转各种多媒体,视频、音频到图片
  9. 牛逼了,用Python攻破wifi密码
  10. Flask框架——ORM数据库