心得:
生活不允许自己懈怠自己,革命尚未成功,同志还须努力,有句话说的好,你尽管努力,剩下的交给天意。

我们从网页上抓取的原始数据大多都是html的数据格式,那如何从html中提取想要的字符串,得需要用到今天所介绍得三种方法:

1.正则表达式

爬虫常用正则表达式:a.*?b(.?)c.?d 可以匹配具备a,b,c,d格式得字符串,但不捕获。常用的分组匹配法,当然还有其他方式匹配,详细匹配请参考:
https://blog.csdn.net/qq_45503700/article/details/102692581

正则表达式默认下只会匹配单行,不会去匹配\n,如果想要去匹配多行或者\n符号,有三种方式:
1.re.findall(r’<div class=“bookname”>.?target="_blank">(.?)’,r,re.S)
2.re.findall(r’<div class=“bookname”>.?target="_blank">(.?)’,r,re.DOTALL)
3.re.findall(r’<div class=“bookname”>.?target="_blank">((?:.|\n)?)’,r,re.S),将 . 改为 ?:.|\n

来看一个例子,爬取小说网站的小说名字:

book_name的段落,抓取的网页中书名都是这种格式,所以我们只需要匹配格式,就可以拿到所有的书名。

"""
<div class="bookname"><a href="http://book.zongheng.com/book/893716.html" target="_blank">逆仙狂刀</a></div>
"""

看代码:

import requests
from lxml import etree
from bs4 import BeautifulSoup
import json
import reurl = 'http://book.zongheng.com/store/c1/c0/b0/u1/p1/v0/s9/t1/u0/i1/ALL.html'
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"}
r=requests.get(url=url,headers=headers).text
re_text=re.findall(r'<div class="bookname">.*?target="_blank">(.*?)</a>',r,re.S)
#应用了多行匹配的属性和分组匹配就很容易匹配到想要的格式
print(re_text)

结果:

PS C:\Users\TianJian\Desktop\python> & C:/Users/TianJian/AppData/Local/Microsoft/WindowsApps/python.exe c:/Users/TianJian/Desktop/python/数据解析1107/数据练习.py
['命运之魔途', '携天命而来', '弑魔英雄传', '捡个老妖当师父', '万古龙神', '逆仙狂刀', '南无斗战胜佛', '浮生墓', '紫罗道', '山海长恨歌', '星辰倒影', '盾御九州', '苜蓿传', '凭虚御风', '乾
源春秋', '龙鸣狮吼', '星帝诀', '问长生', '时间之主', '光暗龙印', '战魂苍穹', '无量魂诀', '认真修炼是不可能的', '六道问心', '最强雇佣兵', '冰裂星空', '我在人间修仙路', '弑神缥缈录', '海
洋传说之魔法王子', '纨绔圣尊', '我有一座灵药铺', '盖世仙尊', '幻武至尊', '山海神纪之凤皇与光之宝石', '紫薇幻', '空山剑雨', '至尊人生', '绝世阎魔', '九霄神皇', '万世环师', '王霸之气最强
者龙傲天', '命运卡牌锦马超', '太鸿', '破渊', '云顶附身系统', '父爱未迟', '幻世异魔录', '不灭道心', '斥天曲', '随身带个游戏库']
PS C:\Users\TianJian\Desktop\python>

2.BeautifulSoup

BeautifulSoup库作为python特有的数据解析库,使用起来还是特别顺手的,介绍一下常用的几种操作方法。

1 导入库
from bs4 import BeautifulSoup2.实例化对象
本地文件:
html_text=open("./test.html","r",encoding="utf-8")
爬取的文本:
html_text=response.textsoup=BeautifulSoup(html.text,"html.parser")3.数据解析的方法和属性:
-find 返回的是节点对象soup.find("div",classname_="value")-find_all 返回的是列表,返回所有符合的标签soup.find_all("div",classname_="value")   -select 层级选择器  返回的是列表定位:soup.select("tang>ul>li>a")  >表示一个层级,定位到a节点soup.select("tang.content>ul>li>a") .content 表示tang节点属性为content的节点soup.select("tang#123>ul>li>a") #123 表示tang节点ID为123的节点取值文本数据:soup_content.string  获取目标节点下的文本,必须是当前节点的文本,有层级关系取不到soup_content.text   获取目标节点下所有的文本内容  取标签中的文本:soup_content.attrs['href'] 取出目标标签中,href属性的文本
4.持久化存储
with open(path,"w",encoding="utf-8") as f:f.write(content)

来看看BeautifulSoup是如何筛选数据的,还是刚刚的小说网站:

import requests
from lxml import etree
from bs4 import BeautifulSoup
import json
import reurl = 'http://book.zongheng.com/store/c1/c0/b0/u1/p1/v0/s9/t1/u0/i1/ALL.html'
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"}
r=requests.get(url=url,headers=headers).text
soup=BeautifulSoup(r,"html.parser")  #实例化soup
#soup.prettify()  用来美化抓取出的数据格式,层次更清晰
result=soup.select("div.bookname>a") #通过分层定位目标节点,返回的result为一个个节点组成的列表
for i in result:  #通过遍历输出每一个节点对应文本print(i.string,end=" ")

结果:

PS C:\Users\TianJian\Desktop\python> & C:/Users/TianJian/AppData/Local/Microsoft/WindowsApps/python.exe c:/Users/TianJian/Desktop/python/数据解析1107/数据练习.py
命运之魔途 携天命而来 弑魔英雄传 捡个老妖当师父 万古龙神 逆仙狂刀 南无斗战胜佛 浮生墓 紫罗道 山海长恨歌 星辰倒影 盾御九州 苜蓿传 凭虚御风 乾源春秋 龙鸣狮吼 星帝诀 问长生 时间之主 光暗
龙印 战魂苍穹 无量魂诀 认真修炼是不可能的 六道问心 最强雇佣兵 冰裂星空 我在人间修仙路 弑神缥缈录 海洋传说之魔法王子 纨绔圣尊 我有一座灵药铺 盖世仙尊 幻武至尊 山海神纪之凤皇与光之宝石
紫薇幻 空山剑雨 至尊人生 绝世阎魔 九霄神皇 万世环师 王霸之气最强者龙傲天 命运卡牌锦马超 太鸿 破渊 云顶附身系统 父爱未迟 幻世异魔录 不灭道心 斥天曲 随身带个游戏库
PS C:\Users\TianJian\Desktop\python>

3.xpath

如果说好用我个人更喜欢用BeautifulSoup库,为啥还要学xpath库,因为xpath库是所有语言通用的库,所以学好之后其他语言也可以使用。还有一点好处是Chrome浏览器可以直接定位出对应节点xpath的语法,所有为了后期更大的发展,建议采用更广法用途的xpath语法。

1 导入库
from lxml import etree2 实例化etree对象本地导入:r=etree.parse(filepath)互联网获取的数据:r=etree.HTML(page_text)3.xpath表达式 (返回的数据格式为列表)
- r.xpath('表达式')定位:- / 表示从跟节点开始定位- // 表示多个层级或者从任意位置开始定位- //div[@class="song"]  属性定位 ,一定要记着不光有属性值还有属性名字- //div[@class="song"]/p[3]  索引定位,索引是从1开始取文本:- //p/text()    获取直系的文本- //p//text()   获取p节点下的所有内容取属性- /@attrs  取属性文本

来看看xpath是如何筛选出小说网站书名的:

import requests
from lxml import etree
from bs4 import BeautifulSoup
import json
import reurl = 'http://book.zongheng.com/store/c1/c0/b0/u1/p1/v0/s9/t1/u0/i1/ALL.html'
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"}
r=requests.get(url=url,headers=headers).text
tree=etree.HTML(r)   #实例化etree对象
name=tree.xpath('//div[@class="bookname"]/a/text()')  #使用xpath语法直接输出节点内容
print(name)

结果:

PS C:\Users\TianJian\Desktop\python> & C:/Users/TianJian/AppData/Local/Microsoft/WindowsApps/python.exe c:/Users/TianJian/Desktop/python/数据解析1107/数据练习.py
['命运之魔途', '携天命而来', '弑魔英雄传', '捡个老妖当师父', '万古龙神', '逆仙狂刀', '南无斗战胜佛', '浮生墓', '紫罗道', '山海长恨歌', '星辰倒影', '盾御九州', '苜蓿传', '凭虚御风', '乾
源春秋', '龙鸣狮吼', '星帝诀', '问长生', '时间之主', '光暗龙印', '战魂苍穹', '无量魂诀', '认真修炼是不可能的', '六道问心', '最强雇佣兵', '冰裂星空', '我在人间修仙路', '弑神缥缈录', '海
洋传说之魔法王子', '纨绔圣尊', '我有一座灵药铺', '盖世仙尊', '幻武至尊', '山海神纪之凤皇与光之宝石', '紫薇幻', '空山剑雨', '至尊人生', '绝世阎魔', '九霄神皇', '万世环师', '王霸之气最强
者龙傲天', '命运卡牌锦马超', '太鸿', '破渊', '云顶附身系统', '父爱未迟', '幻世异魔录', '不灭道心', '斥天曲', '随身带个游戏库']
PS C:\Users\TianJian\Desktop\python>

xpath语法有时匹配的内容不是你想要的字符串,你可以用具体的属性值,来进一步筛选,方法如下:

#原始数据
"""
<div class="bookname"><a href="http://book.zongheng.com/book/893716.html" target="_blank">逆仙狂刀</a></div>
"""
#用此节点下的具体属性来进一步限定
name=tree.xpath('//div[@class="bookname"]/a[contains(@target,"_blank")]/text()')

第二十七篇 网页数据解析三种方法: 正则表达--BeautifulSoup--xpath 满满的干货相关推荐

  1. 前端js调用后端API获取数据的三种方法(2022.7.25)

    前端js调用后台API获取数据的三种方法(2022.7.25) 前言 需求分析 一个Get实例 浏览器请求 SoapUI软件请求 一个Post实例 浏览器请求 SoapUI软件请求 1.Http简介( ...

  2. 用旭日图展示数据的三种方法

    什么是旭日图? 旭日图(Sunburst Chart)是一种现代饼图,它超越传统的饼图和环图,能表达清晰的层级和归属关系,以父子层次结构来显示数据构成情况.旭日图中,离远点越近表示级别越高,相邻两层中 ...

  3. mysql如何防止插入重复数据_防止MySQL重复插入数据的三种方法

    新建表格 CREATE TABLE `person` ( `id` int NOT NULL COMMENT '主键', `name` varchar(64) CHARACTER SET utf8 C ...

  4. python csv库,Python 中导入csv数据的三种方法

    Python 中导入csv数据的三种方法,具体内容如下所示: 1.通过标准的Python库导入CSV文件: Python提供了一个标准的类库CSV文件.这个类库中的reader()函数用来导入CSV文 ...

  5. 如何安全的在不同工程间安全地迁移asset数据?三种方法

    如何安全的在不同工程间安全地迁移asset数据?三种方法 答: 1.将Assets和Library一起迁移 2.导出包package 3.用unity自带的assets Server功能 posted ...

  6. mysql 禁止插入重复数据_防止MySQL重复插入数据的三种方法

    新建表格 CREATE TABLE `person` ( `id` int NOT NULL COMMENT '主键', `name` varchar(64) CHARACTER SET utf8 C ...

  7. Android 免root 备份数据,教你安卓手机免Root恢复手机数据的三种方法

    说到安卓手机,人们对它的第一印象就是开源.自由.可定制.市面上大多数系统,比如Flyme.MIUI其实都是由安卓内核再加上一层自己的包装罢了.所以你会看到手机上一堆预装软件卸载不掉,这本质上就是手机厂 ...

  8. 查看Mat对象的数据的三种方法

    我们有了Mat的对象之后,就可以开始对图像进行处理. 在图像的处理过程中,对数据的查看并且对其进行修改,这应当是比较频繁的操作了. 这里讲讲官方手册当中给出的三种方法. 第一种方法:使用指向Mat数据 ...

  9. python recv_python网络编程调用recv函数完整接收数据的三种方法

    最近在使用python进行网络编程开发一个通用的tcpclient测试小工具.在使用socket进行网络编程中,如何判定对端发送一条报文是否接收完成,是进行socket网络开发必须要考虑的一个问题.这 ...

最新文章

  1. 不同数据类型的处理函数(一)
  2. VMware vSphere 5.1 学习系列之:安装 vCenter Server
  3. win10java怎么运行_win10系统电脑怎样才可以运行Java开发
  4. 随手小记·080911
  5. 全自动采集新闻站源码-单站自动采集新闻源码(seo标题伪原创)
  6. android edittext格式验证,EditText实现输入限制和校验功能实例代码
  7. python的程序变量名_python中变量的名称和程序效率
  8. 牛人自述模拟电路学习历程
  9. Mac电脑快速查找文件的两种方法
  10. 【圣诞快乐】闻到圣诞的气息了,喜欢的节日在慢慢来临~祝大家Merry Christmas。
  11. 如何高效构建融资担保场景化分析体系
  12. 权限管理和备份;规范数据库设计
  13. (多项式)因式分解定理(Factor theorem)与多项式剩余定理(Polynomial remainder theorem)(多项式长除法)
  14. 2019-6浙江工业大学计算机学院转专业二志愿机试题目
  15. 基于bim技术的应用软件有?哪些提高bim工作效率的revit插件
  16. DDOS攻击相关问题
  17. 【无为则无心Python基础】— 18、Python字符串的格式化输出
  18. 网络工程课程设计_某学校网络设计
  19. 关于OpenCV的智能视频监控实现代码
  20. Android 文件打开方式

热门文章

  1. matlab对经济指标分析,财政收入预测与分析MATLAB
  2. 随处可见的红黑树详解
  3. 通达信 缠论分笔、分段DLL插件
  4. python适合做嵌入式开发吗_python可以做嵌入式吗
  5. 破解PPT密码的方法
  6. mapreduce 中文版 中文翻译
  7. .net 部署到服务端IIS,Process调用exe程序无法运行问题解决
  8. 博士学位真的那么重要吗?上交大博士亲述科研心路,获4万高赞!
  9. oracle查询job运行状态,查询当前正在执行的job的情况
  10. 最新的单片机_关于单片机通过蓝牙将数据传输给手机并在app上面显示出来怎么实现...