python爬虫实战之旅( 第三章:数据解析(bs4法))
上接:第三章:数据解析(正则法)
下接:第三章:数据解析(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法))相关推荐
- Python 爬虫实战,模拟登陆爬取数据
Python 爬虫实战,模拟登陆爬取数据 从0记录爬取某网站上的资源连接: 模拟登陆 爬取数据 保存到本地 结果演示: 源网站展示: 爬到的本地文件展示: 环境准备: python环境安装 略 安装r ...
- Python爬虫实战爬取租房网站2w+数据-链家上海区域信息(超详细)
Python爬虫实战爬取租房网站-链家上海区域信息(过程超详细) 内容可能有点啰嗦 大佬们请见谅 后面会贴代码 带火们有需求的话就用吧 正好这几天做的实验报告就直接拿过来了,我想后面应该会有人用的到吧 ...
- python爬虫实战之旅( 第三章:数据解析(xpath法))
上接:第三章:数据解析(bs4法) 下接:第四章:验证码识别 1.xpath解析简介 最常用且最便捷高效的一种解析方式.通用性很好 xpath解析原理 实例化一个etree的对象,且需要将被解析的页面 ...
- Python爬虫实战案例:取喜马拉雅音频数据详解
前言 喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢? 今天带大家爬取喜马拉雅音频数据,一 ...
- 一个Python爬虫案例,带你掌握xpath数据解析方法!
文章目录 xpath基本概念 xpath解析原理 环境安装 如何实例化一个etree对象: xpath('xpath表达式') xpath爬取58二手房实例 爬取网址 完整代码 效果图 xpath图片 ...
- python爬虫系列——开始入土(二)数据解析
数据解析 数据解析分类 正则 例子:使用正则聚焦爬取图片 bs4 bs4提供的用于数据解析的属性和方法 实战练习:爬取三国演义所有章节标题和内容 xpath xpath解析原理 环境的安装 如何实例化 ...
- 路飞学城-Python爬虫实战密训-第1章
正式的开始学习爬虫知识,Python是一门接触就会爱上的语言.路飞的课真的很棒,课程讲解不是告诉你结论,而是在告诉你思考的方法和过程. 第一章,学习了如何爬取汽车之家以及抽屉登录并点赞. 1 impo ...
- 路飞学城-Python 爬虫实战密训-第 1 章
本节学习体会: 鸡汤心得: 1.时代发展太快,要不断学习新东西,武装自己,才能跟得上时代的潮流,不然就是面临被pass的命运 2.要看清楚趋势,不要闭门造车 3.学习编程语言就跟学英语一样,方法很重要 ...
- 路飞学成-Python爬虫实战密训-第3章
1,本节学习体会.心得 : 本章的内容非常多,scrapy框架的使用.对于学过django的人来说.可能要更好理解一些把.个人感觉还是挺简单的.所有的知识点一听就懂,唯一不好的就是时间太紧迫了,不的不 ...
最新文章
- linux下开机启动oracle
- CTFshow 命令执行 web36
- pb系统改java_「软帝学院」:2019一线互联网公司Java高级面试题总结
- Orm框架之XUtils简单使用
- IP地址与MAC地址的区别
- ligergrid 奇偶行效果_怎么护发才是真的有效果的?
- LR中Action,Transaction,Rendezvous,SubmitData的插入顺序请注意
- 理论分析IRLS迭代加权最小二乘法(根据Gorodnitsky and Rao)
- java环境变量配置验证_怎么验证Java环境变量配置成功
- 阿里云服务器搭建私人云盘
- Unity3D第三人称Camera视角旋转实现
- 微信公众号python_微信公共平台框架-python(支持多账号)
- 项目经理必须学会的财务知识
- qcon2016_从QCon San Francisco 2016中学到的重点知识和教训
- 显示性能指标的计算机术语是,下列计算机术语中,属于显示器性能指标的是()...
- APP微信支付(java后台_统一下单和回调)
- 企立方:拼多多直播预热要怎么做
- 一、初级篇——指针(*)、取地址()、解引用(*)与引用()的区别
- E-PUCK机器人-开始
- 知识产权的专利制度来源于何处?