Python爬虫学习之数据提取Beautiful Soup

  • 前期回顾
  • 概述
  • 解析器
  • 准备工作
  • 实例
    • 节点选择器
    • 方法选择器
      • find_all
      • find
  • 总结

前期回顾

Python爬虫学习之requests
Python爬虫学习之数据提取(XPath)

概述

Beautiful Soup是Python的一个HTML或XML的解析库,我们可以很方便的利用它从网页中提取数据。

解析器

解析器 使用方法 优势 劣势
Python标准库 BeautifulSoup(markup, ‘html.parser’) Python的内置标准库、执行速度适中、文档容错力强 Python 2.7.3 或 3.2.2 前的版本中文容错力差
LXML HTML解析器 BeautifulSoup(markup, ‘lxml’) 速度快、文档容错力强 需要安装C语言库
LXML HTML解析器 BeautifulSoup(markup, ‘xml’) 速度快,唯一支持XML的解析器 需要安装C语言库
html5lib BeautifulSoup(markup, ‘html5lib’) 提供最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档 速度慢、不依赖外部扩展

从表中可以看出,LXML解析器有解析HTML和XML的功能,而且速度快、容错能力强,所以推荐使用它。

准备工作

使用Beautiful Soup对HTML解析,需要安装Python的Beautiful Soup和lxml这两个库库。安装命令如下:

# pip 命令
pip install lxml
pip install beautifulsoup4
# pip3 命令
pip3 install lxml
pip3 install beautifulsoup4
# conda 命令
conda install lxml
conda install beautifulsoup4

实例

目标网站 http://www.biqugei.net/ , 首先抓取网站首页内容

import requestsres = requests.get("http://www.biqugei.net/")print(res.text)
# 以下只展示本周热读推荐部分结果<div class="CDcac container body-content"><div class="FTlza panel panel-default"><div class="xLYBo panel-heading"><span class="kHSHX glyphicon glyphicon-fire" aria-hidden="true"></span> 本周热读推荐<a class="hau7I pull-right" href="/top.html">More+</a></div><div class="8wdDp panel-body"><div class="B7ImI row"><div class="T5EB3 col-xs-4 book-coverlist"><div class="FkNE9 row"><div class="iZDC6 col-sm-5"><a href="/page/detail1292.html" class="5tIvU thumbnail" style="background-image:url(https://img.picturecdn.com/files/article/image/1/1287/1287s.jpg)"></a></div><div class="e9DDn col-sm-7 pl0"><div class="HhPUg caption"><h4 class="iH7NL fs-16 text-muted"><a href="/page/detail1292.html" title="神宠又给我开挂了">神宠又给我开挂了</a></h4><small class="XxTAl fs-14 text-muted">石三</small><p class="3QmUt fs-12 text-justify hidden-xs">万古八荒第一神挂!上溯三层世界,最巅峰律令!……三年前,天空坠落三个生灵。西岭秦王得其一,横扫六国统一西岭。南荒大周武曌得其一,纵横南荒十九教,登顶第一。孙长..</p></div></div></div></div><div class="taypp col-xs-4 book-coverlist"><div class="xcP3a row"><div class="cah1s col-sm-5"><a href="/page/detail860.html" class="Y9Bd5 thumbnail" style="background-image:url(https://img.picturecdn.com/files/article/image/0/855/855s.jpg)"></a></div><div class="GhUWN col-sm-7 pl0"><div class="yDSpp caption"><h4 class="fpiwN fs-16 text-muted"><a href="/page/detail860.html" title="上门狂婿">上门狂婿</a></h4><small class="EdfFX fs-14 text-muted">狼叔当道</small><p class="3trdg fs-12 text-justify hidden-xs"> 入赘三年,受尽羞辱;扫墓归来,开启逆袭之路!</p></div></div></div></div><div class="S89sS col-xs-4 book-coverlist"><div class="MXIgP row"><div class="lwg8D col-sm-5"><a href="/page/detail825.html" class="8keqN thumbnail" style="background-image:url(https://img.picturecdn.com/files/article/image/0/820/820s.jpg)"></a></div><div class="qYuPy col-sm-7 pl0"><div class="8lD3a caption"><h4 class="XKajH fs-16 text-muted"><a href="/page/detail825.html" title="巨甜!我在禁欲冷王的怀里恃宠而骄">巨甜!我在禁欲冷王的怀里恃宠而骄</a></h4><small class="VQmaJ fs-14 text-muted">浩瀚之渊</small><p class="MFGaB fs-12 text-justify hidden-xs">一场事故,让恶名昭昭的医学博士江云缨穿到了相府又丑又哑的嫡女身上,开局就是与人偷腥?满级邪恶大佬华丽登场,不做柔弱小白花,谁来惹她,个个反杀!什么?渣爹要把她嫁给克妻的痴傻璃王,双腿残疾还不能人道?完美!药死他是不是可以妻承夫业?于是江云缨带着小算盘当上人人同情的璃王妃,摇身成了京都第一美人,还一边风风火火搞事业。开连锁医馆,建最大商会,立暗杀组织,各方势力纷纷栽在她手里,她还直呼不刺激!被甩满脸</p></div></div></div></div><div class="OUbpT col-xs-4 book-coverlist"><div class="uvZM5 row"><div class="O3ArI col-sm-5"><a href="/page/detail1038.html" class="24IJf thumbnail" style="background-image:url(https://img.picturecdn.com/files/article/image/1/1033/1033s.jpg)"></a></div><div class="gNfCV col-sm-7 pl0"><div class="ATzCK caption"><h4 class="53oTj fs-16 text-muted"><a href="/page/detail1038.html" title="此情惟你独钟">此情惟你独钟</a></h4><small class="x22YR fs-14 text-muted">阮白</small><p class="ynLzE fs-12 text-justify hidden-xs">定好的试管婴儿,突然变成了要跟那个男人同床怀孕,一夜缠绵,她被折磨的浑身瘫软!慕少凌,慕家高高在上的继承人,沉稳矜贵,冷厉霸道,这世上的事,只有他不想办的,没..</p></div></div></div></div><div class="PCxJ1 col-xs-4 book-coverlist"><div class="Dz53C row"><div class="brF6V col-sm-5"><a href="/page/detail65541.html" class="Ghxgz thumbnail" style="background-image:url(https://img.picturecdn.com/files/article/image/65/65536/65536s.jpg)"></a></div><div class="gFMd6 col-sm-7 pl0"><div class="9T3F5 caption"><h4 class="TshUL fs-16 text-muted"><a href="/page/detail65541.html" title="皇家的和尚">皇家的和尚</a></h4><small class="lVT2Q fs-14 text-muted">蓅謃</small><p class="I4QB7 fs-12 text-justify hidden-xs">冯小宝穿越了,竟然变成了名副其实的花和尚。别人穿越都是带着王霸之气,他却只想如何活下去!大唐高宗年间,那是一个多姿多彩的时代,既有威震天下的名臣武将,李靖,长..</p></div></div></div></div><div class="pWrSz col-xs-4 book-coverlist"><div class="MvVkL row"><div class="QUwYH col-sm-5"><a href="/page/detail131077.html" class="5GNTc thumbnail" style="background-image:url(https://img.picturecdn.com/files/article/image/131/131072/131072s.jpg)"></a></div><div class="ZBgtd col-sm-7 pl0"><div class="n1Oo6 caption"><h4 class="bvVYO fs-16 text-muted"><a href="/page/detail131077.html" title="穿越无限之旅">穿越无限之旅</a></h4><small class="ylGL5 fs-14 text-muted">神人无名</small><p class="ZNDCH fs-12 text-justify hidden-xs">金庸武侠中有不少绝世高手,书中有提及名字的,也有不曾提及名字的,但都是拥有自己独有的绝世武功而名动天下。段誉有六脉神剑,欧阳锋有蛤蟆功,林朝英有玉女素心剑法,..</p></div></div></div></div><div class="1hyYi clear"></div></div></div></div>

节点选择器

使用Beautiful Soup选择节点时,直接调用节点的名称即可。

import requests
from bs4 import BeautifulSoupres = requests.get("http://www.biqugei.net/")soup = BeautifulSoup(res.text, 'lxml')h4 = soup.h4
print(h4)

结果如下:

<h4 class="iH7NL fs-16 text-muted"><a href="/page/detail1292.html" title="神宠又给我开挂了">神宠又给我开挂了</a></h4>

不过该方法获取的只有第一个匹配的元素,如果需要匹配多个元素,会比较复杂,不够灵活。Beautiful Soup为我们提供了一些查询方法,如find_allfind。通过这些方法就可以灵活的查询数据了。

方法选择器

find_all

顾名思义,find_all 就是查询所有符合条件的元素,可以给他传入一些属性或者文本来得到符合条件的元素。API如下:

find_all(name, attrs, recursive, string, limit, **kwargs)

find_all 可以根据name来查询元素,值是节点名称,代码如下

h4s = soup.find_all(name='h4')
print(h4s)
[<h4 class="Lr8df fs-16 text-muted"><a href="/page/detail1292.html" title="神宠又给我开挂了">神宠又给我开挂了</a></h4>, <h4 class="5FSmJ fs-16 text-muted"><a href="/page/detail131077.html" title="穿越无限之旅">穿越无限之旅</a></h4>, <h4 class="LM3lo fs-16 text-muted"><a href="/page/detail825.html" title="巨甜!我在禁欲冷王的怀里恃宠而骄">巨甜!我在禁欲冷王的怀里恃宠而骄</a></h4>, <h4 class="bVCAw fs-16 text-muted"><a href="/page/detail65541.html" title="皇家的和尚">皇家的和尚</a></h4>, <h4 class="maBUt fs-16 text-muted"><a href="/page/detail860.html" title="上门狂婿">上门狂婿</a></h4>, <h4 class="UsJlw fs-16 text-muted"><a href="/page/detail1038.html" title="此情惟你独钟">此情惟你独钟</a></h4>]

可以看到我们获取了所有的h4标签元素。返回结果是列表类型,接下来我们可以通过遍历列表,依次获取每个元素里面的a标签。

h4s = soup.find_all(name='h4')
for h4 in h4s:name = h4.find_all(name='a')print(name)
[<a href="/page/detail1292.html" title="神宠又给我开挂了">神宠又给我开挂了</a>]
[<a href="/page/detail131077.html" title="穿越无限之旅">穿越无限之旅</a>]
[<a href="/page/detail825.html" title="巨甜!我在禁欲冷王的怀里恃宠而骄">巨甜!我在禁欲冷王的怀里恃宠而骄</a>]
[<a href="/page/detail65541.html" title="皇家的和尚">皇家的和尚</a>]
[<a href="/page/detail860.html" title="上门狂婿">上门狂婿</a>]
[<a href="/page/detail1038.html" title="此情惟你独钟">此情惟你独钟</a>]

如果要提取每个a标签的文本内容,可以使用string属性:

h4s = soup.find_all(name='h4')
for h4 in h4s:name = h4.find_all(name='a')[0]   //注意,find_all返回的是列表,我们提取数据是需要加上索引来获取第一个元素。print(name.string)
神宠又给我开挂了
穿越无限之旅
巨甜!我在禁欲冷王的怀里恃宠而骄
皇家的和尚
上门狂婿
此情惟你独钟

如果需要获取a标签的href属性该怎么办呢?可以调用attrs获取相关的属性。

h4s = soup.find_all(name='h4')
for h4 in h4s:name = h4.find_all(name='a')[0]   //注意,find_all返回的是列表,我们提取数据是需要加上索引来获取第一个元素。print(name.attrs['href'])
/page/detail65541.html
/page/detail1038.html
/page/detail860.html
/page/detail825.html
/page/detail1292.html
/page/detail131077.html

以上就是利用find_all 方法的name参数提取元素,除此之外,我们还可以根据节点的属性进行提取。

a = soup.find_all(attrs={'title': '皇家的和尚'})
print(a)
[<a href="/page/detail65541.html" title="皇家的和尚">皇家的和尚</a>]

可以看到返回了属性title值为皇家的和尚的a标签,返回类型也是列表类型。提取文本与属性和前面相同。

a = soup.find_all(attrs={'title': '皇家的和尚'})[0]//注意,find_all返回的是列表,我们提取数据是需要加上索引来获取第一个元素。
href = a.attrs['href']
name = a.string
print(href)
print(name)//结果如下
/page/detail65541.html
皇家的和尚

find_all 中的string参数可以用来匹配节点的文本,可以传入字符串或者正则表达式对象,代码如下:

a = soup.find_all(string=re.compile('和尚'))
print(a)
['皇家的和尚', '冯小宝穿越了,竟然变成了名副其实的花和尚。别人穿越都是带着王霸之气,他却只想如何活下去!大唐高宗年间,那是一个多姿多彩的时代,既有威震天下的名臣武将,李靖,长..']

这里string传入的是正则表达式对象,返回结果为所有的与正则表达式匹配的节点的文本组成。

find

除了find_all方法以外,还有find方法也可以提取符合条件的元素,只不过使用find方法只能返回第一个匹配的元素,而find_all返回所有匹配的元素组成的列表。

h4 = soup.find(name='h4')
print(h4)
<h4 class="Okwmx fs-16 text-muted"><a href="/page/detail860.html" title="上门狂婿">上门狂婿</a></h4>

可以看到只返回了第一匹配到的节点名字等于h4的元素。

总结

至此,Beautiful Soup的学习告一段落了,在进行节点选择的时候推荐使用find_all与find方法提取元素。此外,Beautiful Soup还提供了一些其他方法来提取元素,区别在于查询范围不同。

方法名 介绍
find_parents 与 find_parent 前者返回所有的祖先节点,后者返回直接父亲节点
find_next_siblings 与 find_next_sibling 前者返回后面所有的兄弟节点,后者返回后面第一个兄弟节点
find_previous_sibling 与 find_previous_sibling 前者返回前面的所有兄弟节点,后者返回前面第一个兄弟节点
find_all_next 与 find_next 前者返回节点后面所有的符合条件的节点,后者返回后面第一个符合条件的节点
find_all_previous 与 find_previous 前者返回节点前面所有的符合条件的节点,后者返回前面第一个符合条件的节点

Python爬虫学习之数据提取(Beautiful Soup)相关推荐

  1. Python爬虫学习之数据提取(XPath)

    Python爬虫学习之数据提取XPath 概述 常用规则 运算符及介绍 准备工作 实例 文本获取 属性获取 属性值匹配 属性多值匹配 多属性匹配 按序选择 概述 XPath的全称是XML Path L ...

  2. [Python爬虫] 六、数据提取之XPath与lxml类库

    往期内容提要: [Python爬虫] 一.爬虫原理之HTTP和HTTPS的请求与响应 [Python爬虫] 二.爬虫原理之定义.分类.流程与编码格式 [Python爬虫] 三.数据抓取之Request ...

  3. Python爬虫之(八)数据提取-Beautiful Soup

    Beautiful Soup的简介 Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能.它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单 ...

  4. Python爬虫学习实战

    Python爬虫学习实战 前期回顾 概述 技术要求 实战 网页分析与数据提取 小说目录提取 小说章节内容 总结 前期回顾 Python爬虫学习之requests Python爬虫学习之数据提取(XPa ...

  5. [Python爬虫] 三、数据抓取之Requests HTTP 库

    往期内容提要: [Python爬虫] 一.爬虫原理之HTTP和HTTPS的请求与响应 [Python爬虫] 二.爬虫原理之定义.分类.流程与编码格式 一.urllib 模块 所谓网页抓取,就是把URL ...

  6. [Python爬虫] 四、数据抓取之HTTP/HTTPS抓包工具Fiddler

    往期内容提要: [Python爬虫] 一.爬虫原理之HTTP和HTTPS的请求与响应 [Python爬虫] 二.爬虫原理之定义.分类.流程与编码格式 [Python爬虫] 三.数据抓取之Request ...

  7. python中stripped string_【Python爬虫学习笔记(3)】Beautiful Soup库相关知识点总结

    1. Beautiful Soup简介 Beautiful Soup是将数据从HTML和XML文件中解析出来的一个python库,它能够提供一种符合习惯的方法去遍历搜索和修改解析树,这将大大减少爬虫程 ...

  8. 【Python爬虫学习笔记(3)】Beautiful Soup库相关知识点总结

    1. Beautiful Soup简介     Beautiful Soup是将数据从HTML和XML文件中解析出来的一个python库,它能够提供一种符合习惯的方法去遍历搜索和修改解析树,这将大大减 ...

  9. Python爬虫学习手册

    like:128-Python 爬取落网音乐 like:127-[图文详解]python爬虫实战--5分钟做个图片自动下载器 like:97-用Python写一个简单的微博爬虫 like:87-爬虫抓 ...

最新文章

  1. 『流畅的Python』第14章:可迭代的对象、迭代器和生成器
  2. 走,去谷歌的机房逛逛
  3. 弹性服务器架构-连接一切的力量
  4. GPS NMEA 0183 4.10协议/GPS Linux串口驱动
  5. jQuery之防止【冒泡事件】,阻止默认行为 【return false】 event.stopPropagation event.preventDefault...
  6. Day Tips:关于搜索小问题
  7. word2010赠送_我们将赠送两台LulzBot 3D打印机
  8. NB: JAVA_HOME should point to a JDK not a JRE
  9. 如何创造一个能和你对话的语音AI?
  10. Word2013设置多级标题自动编号
  11. jQuery砸金蛋抽奖活动php源码
  12. 恒指赵鑫:7.30恒指德指期货日评与晚盘前瞻
  13. (对对碰)软工结对作业
  14. CCNP 15 交换机3
  15. mysql 数据库第二次安装不了_mysql数据库二次安装无法启动
  16. 白平衡测试—imatest
  17. 观点动力学模型:主要理论与模型综述
  18. LeetCode 881. 救生艇
  19. linux第一块ide硬盘命名为,linux下硬盘分区
  20. Jenkins linter

热门文章

  1. IOS面试攻略(1.0)
  2. 关于抖音年前活动的需求与思考
  3. k8s生命周期---容器探测
  4. 国际信息研究学会专家杜彪:汉字识别是如何走上机器学习领域巅峰的?
  5. golang:%v,%+v,%#v区别
  6. 短视频平台-小说推文(最右)推广任务详情
  7. springboot网页小图标
  8. sdlc esd oracle,SDLC-PCIE高速同步串口卡
  9. C语言到底有多强大?
  10. 技术学习:Python(21)|爬虫篇|selenium自动化操作浏览器