关于爬虫学习的一些小小记录(三)——BeautifulSoup

  • Beautiful Soup
  • 使用 Beautiful Soup 修改代码
  • 黑猫白猫

前面讲了一些访问页面和提取数据的基础方法,学会了挥锤子就该造刀剑了
但 Python 的哲学就是 “不要重复造轮子”,神兵利器都已经被大神们造好了,我们会用就可以了
这次我们就把白板装丢开,谈一个学习爬虫必不可少的工具Beautiful Soup

Beautiful Soup

Beautiful Soup库是 Python 的第三方库,可以解析 html 或 xml 文件,提供了许多可以高效提取数据的方法,让提取数据变得十分简单、灵活。而且 Beautiful Soup 可以自动把 html 和 xml 文件编码格式转化成 Unicode,输出时转化成 utf-8,不需要再手动转码
老规矩,这是一份中文版的 Beautiful Soup 的官方文档
食不惯中文版的童鞋可以品尝英文版

这里列出最常用的,也是我最喜欢的find_all()方法,该方法用于搜索当前 tag 的所有子孙结点,并以列表形式返回匹配到的所有内容

find_all(name, attrs, recursive, text, **kwargs)

name,查找所有名字为 name 的 tag,自动忽略字符串对象。可接受任一数据类型,如字符串,正则表达式,列表,True
attrs,按照 CSS 类名搜索 tag,因为 class 是 Python 的关键字,使用 class_ 代替使用
recursive,当值为 False 时,find_all() 只搜索当前 tag 的直接子结点
text,搜索文档中的字符串内容,同样可以接受任一数据类型
kwargs,可选的,当字典的 key 不是内置的参数名时,作为当前 tag 的属性名进行搜索

另外find()的用法跟find_all()差不多,但返回的内容是匹配到的第一个 tag,并不是只有一个 tag 的列表

使用 Beautiful Soup 修改代码

在上一篇中,我们写了一个从豆瓣爬取 2019 版《倚天屠龙记》演职员数据信息的爬虫程序,这是最终扩展后的代码

# 爬虫--爬取豆瓣 2019版 《倚天屠龙记》 全体演职员import re
from urllib import requesturl = 'https://movie.douban.com/subject/25865815/celebrities'response = request.urlopen(url)  # 访问 url
page = response.read().decode()  # 以 utf-8 的格式读取数据names = re.findall('" class="name">(.*)</a></span>', page)  # 正则表达式匹配
roles = re.findall('span class="role" title="(.*)">', page)  # 匹配职位
imgs = re.findall('style="background-image: url\((.*)\)">', page)  # 匹配图片链接i = 0
while i < len(names):role_list = roles[i].split(' ')  # 避免因文件名过长无法建立,只好从这里切短role = role_list[0] + ' (' + role_list[-1]  # 切碎了重新拼一下img_name = r'19版《倚天屠龙记》演职员/' + names[i] + ' ' + role + r'.jpg'img = request.urlretrieve(imgs[i], img_name)i += 1

现在,我们使用 Beautiful Soup 来精简一下这个代码
还是事先分析一波

演职员姓名和职位都在span标签中,CSS 类名分别为name和role,而图片链接在div标签中,CSS 类名为avatar,都可以直接使用find_all()方法匹配

使用 Beautiful Soup 精简后的代码如下

# 爬虫--爬取豆瓣 2019版 《倚天屠龙记》 全体演职员——美丽汤修改版from bs4 import BeautifulSoup
from urllib import requesturl = 'https://movie.douban.com/subject/25865815/celebrities'response = request.urlopen(url)  # 访问 url
page = response.read().decode()  # 以 utf-8 的格式读取数据soup = BeautifulSoup(page, 'html.parser')  # 使用 Python 内置的 html.parser 解析器names = soup.find_all('span', 'name')  # tag 名和 CSS 类名匹配姓名
roles = soup.find_all('span', 'role')  # 匹配职位
imgs = soup.find_all('div', 'avatar')  # 匹配图片链接i = 0
while i < len(names):role_list = roles[i].string.split(' ')  # 避免因文件名过长无法建立,只好从这里切短role = role_list[0] + ' (' + role_list[-1]  # 切碎了重新拼一下img_name = r'19版《倚天屠龙记》演职员1/' + names[i].string + ' ' + role + r'.jpg'img_url = imgs[i].get('style').split('(')[1].split(')')[0]  # 选取括号中的部分img = request.urlretrieve(img_url, img_name)i += 1

运行结果跟修改前的一样,这里就不给出了

黑猫白猫

想来机智的小伙伴们也发现了,Beautiful Soup 在匹配查找 tag 时十分方便,因为匹配方式多样,而且返回的就是 tag 类型数据。但如果匹配的是 tag 的部分字节时,需要通过匹配到的 tag,对属性进行调用来间接获取,不能像正则表达式一般直接返回匹配的内容

比如在上面的程序中,提取图片链接时,imgs 列表中存储的是 div 标签。我们需要使用 imgs[i].get(‘style’) 获取 tag 中的 style 属性值,然而这还不是一个可以访问的 url。我们要使用 split 把这个值进一步分割,取出括号中的 url。这才算成功提取,显然要比正则表达式麻烦许多。

这样看来,这次选择的例子并不合适来凸显美丽汤的高效简便。

当然,这也说明,我们应当实事求是。美丽汤虽有不足,正则表达式在某些情况也可能出现匹配不精准的情况,我们可以结合使用。黑猫白猫都可以捉到老鼠

关于爬虫学习的一些小小记录(三)——BeautifulSoup相关推荐

  1. 把爬取信息导出到mysql,关于爬虫学习的一些小小记录(四)——爬取数据存入数据库...

    关于爬虫学习的一些小小记录(四)--爬取数据存入数据库 创建数据库 pymysql 模块 具体操作 预知后事如何 前面我们已经讲了怎么访问网页,并且从网页源码中提取数据.既然数据有了,怎样管理就是下一 ...

  2. python爬虫正则表达式实例-python爬虫学习三:python正则表达式

    python爬虫学习三:python正则表达式 1.正则表达式基础 a.正则表达式的大致匹配过程: 1.依次拿出表达式和文本中的字符比较 2.如果每一个字符都能匹配,则匹配成功:一旦有匹配不成功的字符 ...

  3. MySQL学习记录 (三) ----- SQL数据定义语句(DDL)

    相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...

  4. 基于jupyter notebook的简单爬虫学习记录

    目录 前言 一.基础理解 二.前期准备 三.爬虫实操[入门] 3.1.引入库 3.2.请求网页 3.3.解析网页 3.3.1.网页解读 3.3.2.熟悉部分BeautifulSoup语法规则 3.4. ...

  5. Python爬虫学习第三章-4.3-使用xpath解析爬取全国城市名称

    Python爬虫学习第三章-4.3-使用xpath解析爬取全国城市名称   这一节主要是使用xpath解析爬取全国城市名称 这里使用的网址是:空气质量历史数据查询   这一个案例体现的点主要是xpat ...

  6. css学习记录三:文本属性

    css学习记录三:CSS文本属性 一.文本属性的作用 二.文本颜色 三.文本对齐 四.装饰文本 五.文本缩进 六.行间距 一.文本属性的作用 CSSS Text(文本)属性可定义文本的外观,比如文本的 ...

  7. Kafka学习记录(三)——Broker

    Kafka学习记录(三)--Broker 目录 Kafka学习记录(三)--Broker 对应课程 Zookeeper存储的Kafka信息 Broker总体工作流程 Broker的服役和退役 Kafk ...

  8. python爬虫学习笔记-网络爬虫的三种数据解析方式

    爬虫的分类 1.通用爬虫:通用爬虫是搜索引擎(Baidu.Google.Yahoo等)"抓取系统"的重要组成部分.主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份 ...

  9. 爬虫学习笔记(三)——利用JSON爬取豆瓣热映的使用

    系列文章目录 爬虫学习笔记(一):requests基础用法之爬取各类主流网站1 爬虫学习笔记(二):requests基础用法之爬取各类主流网站2 文章目录 系列文章目录 前言 一.JSON是什么? 二 ...

最新文章

  1. 【Dijkstra算法】未优化版+优先队列优化版
  2. Ubuntu 对比 CentOS 后该如何选择?
  3. Windows上也能用Swift编程了,官方编译工具安装包现已上线
  4. Python之pandas:pandas中缺失值与空值处理的简介及常用函数(drop()、dropna()、isna()、isnull()、fillna())函数详解之详细攻略
  5. 经典论文复现 | 基于深度学习的图像超分辨率重建
  6. Error starting userland proxy: listen tcp 0.0.0.0:5601: bind: address already in use
  7. linux下面安装Matlab2017b、快捷键修改、修改背景颜色(转载+自己整理)
  8. Asterisk拨号方案常用函数说明
  9. 汉字转换成拼音的代码(asp版)
  10. 设计模式的七大设计原则:其七:合成复用原则
  11. c语言玫瑰花图形程序,一个玫瑰花的程序
  12. [ios] 申请账号,发布应用
  13. Android 自定义一个简版的取色器ColorPicker
  14. 开源中国众包平台派活:微信小程序任务
  15. 正本清源!!!!!!:HWDB1.1数据集.gnt转换成.png
  16. 电脑连接了网络却打不开网页
  17. curl工具使用简介
  18. matlab回归分析结果输出,科学网—回归分析的MATLAB和R程序实现 - 王福昌的博文...
  19. Android之使用SurfaceView制作简易写字板
  20. html5语音读取文字_随时查,随时读,随时记--汉王e典扫描翻译笔A20T语音版

热门文章

  1. drools-insert与update
  2. 0xc000007b解决办法支持列表
  3. 计算机网络谢希仁第七版课后答案完整版 微课视频 配套课件
  4. 2020考研东南935数据结构算题
  5. [交换生申请之后](http://simplemind.info/blog/?p=413)
  6. 中国古代哲学书籍目录
  7. 1.1、SR(Segment Routing Over MPLS) 介绍
  8. 自动售货机软件工程课设_软件工程 自动售货机
  9. java httpclient 采集_使用java HttpClient 与Web服务器交互 - elliott - 博客园
  10. java jsp eq_javaWeb核心技术第九篇之JSP