上接:第三章:数据解析(正则法)
下接:第三章:数据解析(xpath法)

1.数据解析步骤

  • 标签定位
  • 提取标签,标签属性中存储的数据值

2.bs4数据解析的原理

  • 实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中
  • 通过调用BeautifulSoup对象中相关的属性或者方法进行标签定位和数据提取

环境安装

  • pip install bs4
  • pip install lxml

使用实例化BeautifulSoup

  • from bs4 import BeautifulSoup
  • 对象的实例化
    • 方法①:将本地的html文档中的数据加载到该对象中

用于测试的text.html如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>此页面以作为测试</title>
</head>
<body>
<p>body 元素的内容会显示在浏览器中。</p>
<p>title 元素的内容会显示在浏览器的标题栏中。</p>
</body>
</html>
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoupif __name__ == "__main__":#将本地的html文档中的数据加载到该对象中fp =open('./test.html','r',encoding='utf-8')soup = BeautifulSoup(fp,'lxml')print(soup)pass

输出结果:

  • 方法②:将互联网上获取的页面源码加载到该对象中(实际运用得更多)
    主要用到得语句为
page_text = response.text
soup = BeautifulSoup(page_text,'lxml')

3.bs4中提供的方法和属性:

暂时仍以本地的text.html文件为例——

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>此页面以作为测试</title>
</head>
<body><div><p>百里守约</p></div><div class="song"><p>李清照</p><p>王安石</p><p>苏轼</p><p>柳宗元</p><a href="http://www/song.com/" title="赵匡胤" target="_self"><span>this is span</span>宋朝时最强大内王朝,不是军队的强大,而是经济很强大,国民都很有钱</a><a href="" class="du">总为浮云能避日,长安不见使人愁</a><img src="http://www.baidu.com/moinv.jpg" alt="" /></div><div class="tang"><ul><li><a href="http://www.baidu.com" title="qing">清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村</a></li><li><a href="http://www.163.com" title="qin">秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a></li><li><a href="http://www.126.com" title="qi">岐王宅里寻常见,崔久堂前几度闻,正是江南好风景,落花时节又逢君</a></li><li><a href="http://www.sina.com" title="du">杜甫</a></li><li><a href="http://www.dudu.com" title="du">杜牧</a></li><li><b>happy</b></li><li><i>hello world!</i></li><li><a herf="http://www.haha.com" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋秦径,晋代衣冠成古丘</a></li></ul></div>
</body>
</html>

①soup.tagNme

soup.tagName 返回的是html中第一次出现的tagName标签内容

②soup.find()

find('tagName'):等同于soup.tagName,只返回第一次出现的标签内容

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoupif __name__ == "__main__":#将本地的html文档中的数据加载到该对象中fp =open('./test.html','r',encoding='utf-8')soup = BeautifulSoup(fp,'lxml')print(soup.a)#soup.tagName 返回的是html中第一次出现的tagName标签print("------分割线---------")print(soup.div)print("------分割线---------")print(soup.find('div'))pass


soup.find()也可以做html网页中class得定位,不过写的时候要注意class带下划线“class_”:

print(soup.find('div',class_='song'))

输出样例:

当然其他的属性也可以:

print(soup.find('div',class_/id/attr='song'))

③soup.find_all()

可以找到符合要求的所有标签,返回一个列表。

④soup.select()

参数可以放置某种选择器(类选择器/标签选择器/id选择器等等),返回一个列表
以类选择器为例:

select也可以用于层级选择器
比如这里只想输出:
<li><a href="http://www.baidu.com" title="qing">清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村</a></li>
分析这句话在html当中的结构位置,是在tang这个类中的li层级的a标签中的第一个,所以将代码部分输出改为:

print(soup.select('.tang>ul>li>a')[0])

注意这里的'>'表示一个层级,要想在多个层级中找所有a标签的内容可以把>换为空格' ',即不再只针对当前的li层级进行查找。

print(soup.select('.tang>ul a')[0])

输出:

4.标签之间的数据爬取

①.获取标签之间的文本数据

soup.a.text/string/get_text()
  • text/get_text():可以获取某一个标签中所有的文本内容
  • string只可以获取当前标签下的直系内容

如图所示

检查text.html文件中可以看到,div板块是没有直系内容的。

②.获取标签中属性值

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoupif __name__ == "__main__":#将本地的html文档中的数据加载到该对象中fp =open('./test.html','r',encoding='utf-8')soup = BeautifulSoup(fp,'lxml')print(soup.select('.tang > ul a')[0]['href'])pass

输出:

http://www.baidu.com

检查test.html代码信息一致

5.代码实战:爬取三国演义小说所有的章节标题和章节内容

选用网址:https://www.shicimingju.com/book/sanguoyanyi.html

首先需要理解标签之间的层级关系:

  • 可以定位到一个章节标题,发现他是li>a的一个标签中,而其中的文本内容就是我们要解析的章节标题,其中href对应的url就是我们要找的章节内容对应的url
  • 因为章节是一个列表的形式,要批量获取代码信息,选用select()函数就很好

鼠标右键——检查——

但这里要注意网站对于中文的编码形式,gzip是一种压缩文件,解码的时候要用utf-8转码中文。

代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoup
import requests
import gzipif __name__ == "__main__":#UA伪装headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.11 Safari/537.36'}#对首页的页面数据进行爬取url='https://www.shicimingju.com/book/sanguoyanyi.html'page_text=requests.get(url=url,headers=headers)#因为原网站使用了gzip压缩文件,直接用text获取的中文将是乱码,所以要先转码page_text.encoding='utf-8'page_text=page_text.text#在首页中解析出章节的标题和详情页的url#1.在实例化BeatifulSoup对象,需要将页面源码数据加载到该对象中soup=BeautifulSoup(page_text,'lxml')#2.解析章节标题和详情页的urlli_list = soup.select('.book-mulu > ul >li')fp=open('./sanguoyanyi.txt','w',encoding='utf-8')for li in li_list:title = li.a.stringdetail_url = 'http://www.shicimingju.com'+li.a['href']detail_page_text = requests.get(url=detail_url,headers=headers)detail_page_text.encoding='utf-8'detail_page_text=detail_page_text.text#3.解析出详情页中相关的章节内容detail_soup = BeautifulSoup(detail_page_text,'lxml')#属性定位div_tag = detail_soup.find('div',class_='chapter_content')content=div_tag.text# 持久化存储fp.write(title+':'+content+'\n')print(title)passprint("爬取数据成功!")pass

输出:

python爬虫实战之旅( 第三章:数据解析(bs4法))相关推荐

  1. Python 爬虫实战,模拟登陆爬取数据

    Python 爬虫实战,模拟登陆爬取数据 从0记录爬取某网站上的资源连接: 模拟登陆 爬取数据 保存到本地 结果演示: 源网站展示: 爬到的本地文件展示: 环境准备: python环境安装 略 安装r ...

  2. Python爬虫实战爬取租房网站2w+数据-链家上海区域信息(超详细)

    Python爬虫实战爬取租房网站-链家上海区域信息(过程超详细) 内容可能有点啰嗦 大佬们请见谅 后面会贴代码 带火们有需求的话就用吧 正好这几天做的实验报告就直接拿过来了,我想后面应该会有人用的到吧 ...

  3. python爬虫实战之旅( 第三章:数据解析(xpath法))

    上接:第三章:数据解析(bs4法) 下接:第四章:验证码识别 1.xpath解析简介 最常用且最便捷高效的一种解析方式.通用性很好 xpath解析原理 实例化一个etree的对象,且需要将被解析的页面 ...

  4. Python爬虫实战案例:取喜马拉雅音频数据详解

    前言 喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢? 今天带大家爬取喜马拉雅音频数据,一 ...

  5. 一个Python爬虫案例,带你掌握xpath数据解析方法!

    文章目录 xpath基本概念 xpath解析原理 环境安装 如何实例化一个etree对象: xpath('xpath表达式') xpath爬取58二手房实例 爬取网址 完整代码 效果图 xpath图片 ...

  6. python爬虫系列——开始入土(二)数据解析

    数据解析 数据解析分类 正则 例子:使用正则聚焦爬取图片 bs4 bs4提供的用于数据解析的属性和方法 实战练习:爬取三国演义所有章节标题和内容 xpath xpath解析原理 环境的安装 如何实例化 ...

  7. 路飞学城-Python爬虫实战密训-第1章

    正式的开始学习爬虫知识,Python是一门接触就会爱上的语言.路飞的课真的很棒,课程讲解不是告诉你结论,而是在告诉你思考的方法和过程. 第一章,学习了如何爬取汽车之家以及抽屉登录并点赞. 1 impo ...

  8. 路飞学城-Python 爬虫实战密训-第 1 章

    本节学习体会: 鸡汤心得: 1.时代发展太快,要不断学习新东西,武装自己,才能跟得上时代的潮流,不然就是面临被pass的命运 2.要看清楚趋势,不要闭门造车 3.学习编程语言就跟学英语一样,方法很重要 ...

  9. 路飞学成-Python爬虫实战密训-第3章

    1,本节学习体会.心得 : 本章的内容非常多,scrapy框架的使用.对于学过django的人来说.可能要更好理解一些把.个人感觉还是挺简单的.所有的知识点一听就懂,唯一不好的就是时间太紧迫了,不的不 ...

最新文章

  1. linux下开机启动oracle
  2. CTFshow 命令执行 web36
  3. pb系统改java_「软帝学院」:2019一线互联网公司Java高级面试题总结
  4. Orm框架之XUtils简单使用
  5. IP地址与MAC地址的区别
  6. ligergrid 奇偶行效果_怎么护发才是真的有效果的?
  7. LR中Action,Transaction,Rendezvous,SubmitData的插入顺序请注意
  8. 理论分析IRLS迭代加权最小二乘法(根据Gorodnitsky and Rao)
  9. java环境变量配置验证_怎么验证Java环境变量配置成功
  10. 阿里云服务器搭建私人云盘
  11. Unity3D第三人称Camera视角旋转实现
  12. 微信公众号python_微信公共平台框架-python(支持多账号)
  13. 项目经理必须学会的财务知识
  14. qcon2016_从QCon San Francisco 2016中学到的重点知识和教训
  15. 显示性能指标的计算机术语是,下列计算机术语中,属于显示器性能指标的是()...
  16. APP微信支付(java后台_统一下单和回调)
  17. 企立方:拼多多直播预热要怎么做
  18. 一、初级篇——指针(*)、取地址()、解引用(*)与引用()的区别
  19. E-PUCK机器人-开始
  20. 知识产权的专利制度来源于何处?

热门文章

  1. com.mysql.cj.jdbc.exceptions.MysqlDataTruncation
  2. HSV颜色模型及颜色分量范围
  3. Linux 内核设计与实现之第17章 设备与模块
  4. Linux 基础命令包以及table自动补全包
  5. Unity 角色血条
  6. 三、程序计数器(PC寄存器)
  7. 安装Mysql-8.0.11遇到的问题
  8. [转载] 我的数据仓库之路
  9. iPhone SE销量惨淡?看看这些数据就知道了
  10. 视频编解码优化的几个概念