文章目录

  • 前言
  • 一、正则表达式是什么?
  • 二、正则表达式语法
    • 1、简介
    • 2、干货分享
  • 三、re库
    • 1、安装
    • 2、用法
  • 四、终于进入正题
  • 小结

前言

这是本系列第一个实战项目的第四课,有关前三课相关的内容请访问小远的主页。(上一课的链接)

上一节我们已经利用lxml库将https://jobs.51job.com/pachongkaifa/p1/中的工作一条一条列好了,但是发现拿下来的数据并不能很直观的显示出来,比如

----------第1个工作----------

<div class="e ">
<em class="check" name="delivery_em" onclick="checkboxClick(this)"/>
<input class="checkbox" type="checkbox" name="delivery_jobid" value="127214253" style="display:none" jt="0"/>
<p class="info"><span class="title"><a title="爬虫工程师 实习生" target="_blank" href="https://jobs.51job.com/nantong/127214253.html?s=02">爬虫工程师 实习生</a></span><a title="南通伊奈贸易有限公司" target="_blank" class="name" href="https://jobs.51job.com/nantong/co4347673.html">南通伊奈贸易有限公司</a><span class="location name">南通</span><span class="location">0.3-1万/月</span><span class="time">12-01</span></p>
<p class="order">学历要求:本科<span>|</span>工作经验:在校生/应届生<span>|</span>公司性质:民营公司<span>|</span>公司规模:50-150人</p>
<p class="text" title=" 1.全日制本科以以上学历,统计学或计算机相关专业毕业,有数据分析/数据挖掘工作经验优先;2.扎实的数理统计理论知识,熟悉数据挖掘理论与方法,突出的逻辑分析和归纳能力,优秀的业务洞察力与执行力,主观能动性强;3.熟练使用Python语言,掌握numpy、pandas、sklearn、selenium、scrapy、sqlalchemy等包的用法4. 熟悉掌握sql语言,包括但不限于mysql,SqlServer等关系型数据库5.良好的沟通能力,乐于接受新鲜事物,学习能力强,优秀的团队合作精神。 ***"> 1.全日制本科以以上学历,统计学或计算机相关专业毕业,有数据分析/数据挖掘工作经验优先;2.扎实的数理统计理论知识,熟悉数据挖掘理论与方法,突出的逻辑分析和归纳能力,优秀的业务洞察力与执行力,主观能动性强;3.熟练使用Python语言,掌握numpy、pandas、sklearn、selenium、scrapy、sqlalchemy等包的用法4. 熟悉掌握sql语言,包括但不限于mysql,SqlServer等关系型数据库5.良好的沟通能力,乐于接受新鲜事物,学习能力强,优秀的团队合作精神。 ***</p>
<p class="opat">
<input value="127214253" name="hidJobID127214253" id="hidJobID127214253" type="hidden" jt="0"/>
<a class="sq sicon Dm" href="javascript:void(0);" onclick="delivery('hidJobID127214253', '1', '//i.51job.com', 'c', '', '02', '02', '//img02.51jobcdn.com');return false;">立即申请</a><br/><a class="sc sicon Dm" href="javascript:void(0);" onclick="saveCollection('127214253');">收藏</a>
</p>
</div>

对这一大段字符串中数据的提取,最常用的就是正则了,那么马上进入今天的分享:


一、正则表达式是什么?

英语好的同学可以挑战观看一下这个视频,如果你看懂了基本上就可以直接跳过这一大段了。

估计99.99999%的中国人都不知道,其实这个只看字面意思的话完全看不明白的词语——“正则”,是一个地道的中国原创词汇。
比如屈原的《离骚》中:

名余曰正则兮,字余曰灵均。

翻译成现代汉语的意思就是:“把我的名取为正则啊,把我的字叫作灵均”。
大家都知道,屈原名平,字原,而“正则”是对“平”字进行的解释(就像诸葛亮字孔明一样,孔之明者,亮也)。”正则“拆分理解就是公正而有法则。简单来说,就是屈原他们家长辈给他取名字的时候希望“正其礼仪法则”,故曰“正则”。

那么前面解释了那么一通,再在这里讲计算机里的“正则”就好理解了。在各种编程语言中,正则代表“正则表达式”。从最早的Perl到后来的Java、.NET,都提供了这种文本分析的高级工具。在Python中,正则表达式是特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。换句话说,计算机的“正则表达式”就是要公正而有法则地检查一个字符串是否符合编程者所指定的某个规则

二、正则表达式语法

1、简介

老实说,这篇文章我真的不知道要写些什么,网上的各路大神都已经把正则语法翻来覆去讲了不知道多少遍了,截至2020-12-1,仅仅B站上面用“正则”做关键字搜出来的相关视频就有50多页!!!

这还不包括其他网站的视频还有相关的文件,简直不计其数。小远想找到我当时学的时候看的教学视频与大家分享,但是找了半天发现它已经被大量优质的视频资源埋没在了茫茫的互联网中。没办法了,只能找两个我认为比较有用的视频推荐给大家

想快速上手,看
正则表达式15分钟速成

想稳打稳扎,看
《孙兴华讲正则表达式》基于Python【已完结】

2、干货分享

当然在这里,除了视频之外,我还要推荐一些其他的干货,这都是小远在真实的爬虫开发实战中总结出的一些经验:

首先,推荐一个非常方便的在线正则表达式测试网站

有的时候正则不能保证100%一写就能用,就像Xpath路径一样,有时候要反复的试才知道写得对不对。但某些网站的反爬做得挺好,反爬较为强大,它会检测你的访问次数,就是说,在一段时间内哪怕你十分注意但还是会有封号之类的风险[就是用你的ID暂时性的访问不了这个网站了,哪怕这个时候你用回正规浏览器去访问这个网站都不行],这就很麻烦。

这个网站就能很好的解决问题,先跑一遍程序把数据拿下来,然后复制粘贴到这个网站里,正则在里面反复试就行了,试通了就往Python程序里面一贴,完事。美中不足的是有一个毛病,就是这个网站不能匹配换了行的字符串,没理解这句话的话你用着用着就理解了。

第二个小干货就是小远在实战中总结出的一些正则语句,挺有用的

> 英文字符串:^[A-Za-z]+$
> 英文字符数字串:^[A-Za-z0-9]+$
> 汉字:^[\u4e00-\u9fa5]{0,}$
> 手机号:^1[34578]\d{9}$
> qq号验证(5-11位):^[1-9][0-9]{4,10}$
> E-mail地址:^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$
> ……

尽管有些可能不甚完美,但是大多数场景下是可以用的了,还有哪些欢迎在下方评论区补充留言。

三、re库

re的名取自英语regex【regular expression的简写,短语的意思为规则的表达方式,不过regex已经单独成为了一个词语,译为“正则表达式”】,re库是Python处理正则用的库

1、安装

re库的安装方法可参考第一课中requests库的安装,链接

2、用法

这个库的用法网上实在太多,小远自觉才疏德薄,也讲不出什么新东西来。

所以老规矩,既然人家讲得好,那就看人家的。

文章-python之re模块详解
文章-Python小知识-正则表达式和Re库(二)
视频-Python爬虫re模块的使用,也许你掌握的并不全面!

小平爷爷说:“不管黑猫白猫,能捉老鼠的就是好猫”。博主真的不想水文章,但是实在是人家写得太好了而且太全面了,反复一点东西讲来讲去也没有意思,我比较喜欢分享一些自己总结出来的东西,网页中的链接都是博主精心反复挑选过的,质量挺高。插一句题外话,学电脑就是这样,人家好,就学人家的,然后再找机会超越人家,如果真的有小白通过我的文章学会了爬虫这个技能,那就是小远最开心的了,毕竟大家都是要为中国电子信息技术的发展出力的一份子,建设一个更加美丽的中国需要大家共同的努力,分什么你我呢?

四、终于进入正题

前面铺垫了一箩筐,终于来到了正题

将我们上一节课拿到的一条工作信息复制进那个在线正则匹配的网页中,如图:
(网页代码在文章开始的地方有,如果仅为了尝试的话复制即可。)
(注意复制进去后手动删除所有换行)

这里博主写好的正则是:(仅供参考)

.*href="(.*)">(.*)</a.*href=.*">(.*)</a.*me">(.*)</span.*on">(.*)</span.*me">(.*)</span.*:(.*)<s.*:(.*)<s.*:(.*)<s.*:(.*)</p.*title=

将其写入Python项目中

# -*- coding: utf-8 -*-
# @Time: 2020/11/29 14:21
# @Author: 胡志远
# @Software: PyCharm# 导入re包
import re
# 导入requests包
import requests
# 导入lxml中的html模块
from lxml import html
# 网页链接
url = "https://jobs.51job.com/pachongkaifa/p1/"
# 请求头
headers = {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","Accept-Encoding": "gzip, deflate, br","Accept-Language": "zh-CN,zh;q=0.9","Connection": "keep-alive","Cookie": "guid=7e8a970a750a4e74ce237e74ba72856b; partner=blog_csdn_net","Host": "jobs.51job.com","Sec-Fetch-Dest": "document","Sec-Fetch-Mode": "navigate","Sec-Fetch-Site": "none","Sec-Fetch-User": "?1","Upgrade-Insecure-Requests": "1","User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
}
# 有请求头写法
res = requests.get(url=url, headers=headers)
res.encoding = "gbk"
# 生成Element对象
etree = html.etree
html_elements = etree.HTML(res.text)
# 根据Xpath路径获取每一个工作的对象
Jobs_element = html_elements.xpath('//div[@class="detlist gbox"]/div')
# 正则
regex = '.*href="(.*)">(.*)</a.*href=.*">(.*)</a.*me">(.*)</span.*on">(.*)</span.*me">(.*)</span.*:(.*)<s.*:(.*)<s.*:(.*)<s.*:(.*)</p.*title='
for aJob in Jobs_element:print("{:-^25}".format("第{}个工作".format(Jobs_element.index(aJob)+1)))print(re.findall(regex, etree.tostring(aJob, encoding="utf-8").decode(), re.S))

【运行截图】

【!!!】
这个时候发现一个问题,第十二个工作的数据没匹配出来,往前找原因,发现它的数据是拿得下来的。查看网页,发现第十二个岗位确实与众不同

由于我后面需要分析的数据就有工资水平,如果没有工资,那么这条数据就没有意义了,所以,索性不要了。我们用一个总列表来存储所有的数据。将部分代码修改如下

Information = list()
for aJob in Jobs_element:Information += re.findall(regex, etree.tostring(aJob, encoding="utf-8").decode(), re.S)
# 查看总列表
for item in Information:print(item)

【运行截图】

至此,一页的数据基本就被拿下来了,但是我要的是所有的岗位,据了解,前程无忧岗位信息每天都会刷新,第一课说要13页数据,小远今天一看只有12页了,为了方便起见,我们拿十页的数据算了。

修改代码:

# -*- coding: utf-8 -*-
# @Time: 2020/11/29 14:21
# @Author: 胡志远
# @Software: PyCharm# 导入re包
import re
# 导入requests包
import requests
# 导入lxml中的html模块
from lxml import html
# 请求头
headers = {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","Accept-Encoding": "gzip, deflate, br","Accept-Language": "zh-CN,zh;q=0.9","Connection": "keep-alive","Cookie": "guid=7e8a970a750a4e74ce237e74ba72856b; partner=blog_csdn_net","Host": "jobs.51job.com","Sec-Fetch-Dest": "document","Sec-Fetch-Mode": "navigate","Sec-Fetch-Site": "none","Sec-Fetch-User": "?1","Upgrade-Insecure-Requests": "1","User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
}
Information = list()
for i in range(1, 11):# 网页链接url = "https://jobs.51job.com/pachongkaifa/p{}/".format(i)# 有请求头写法res = requests.get(url=url, headers=headers)res.encoding = "gbk"# 生成Element对象etree = html.etreehtml_elements = etree.HTML(res.text)# 根据Xpath路径获取每一个工作的对象Jobs_element = html_elements.xpath('//div[@class="detlist gbox"]/div')# 正则regex = '.*href="(.*)">(.*)</a.*href=.*">(.*)</a.*me">(.*)</span.*on">(.*)</span.*me">(.*)</span.*:(.*)<s.*:(.*)<s.*:(.*)<s.*:(.*)</p.*title='for aJob in Jobs_element:Information += re.findall(regex, etree.tostring(aJob, encoding="utf-8").decode(), re.S)
# 查看总列表
for item in Information:print(item)

【运行结果】前十页的信息

还没有结束,还有可以继续改进的地方,比如说,如果要对各单位薪资进行统计分析的话,单位最好要统一。对于数据的详细处理将会在之后推出,敬请期待。

下一节已更新


小结

使用re的步骤:
1、引入包(import)
2、写好正则表达式
3、使用re模块匹配

如果觉得博主写的还不错的,欢迎点赞、评论、加关注,大家的访问就是博主更新文章不竭的源动力!

入门小远学爬虫(二)(四)简单GET型网页爬虫实战——“前程无忧”爬虫岗位信息的爬取之正则概念以及Python中re库的简单应用相关推荐

  1. Python中mechanize库的简单使用说明

    该库与urllib.urllib2类似,用一个简单的例子说明它的使用: #!/usr/bin/env/ python #coding=utf-8 import mechanize import coo ...

  2. Python中Pygal库的简单使用

    绘制直方图 绘制一个直方图分析掷骰子结果 先创建一个骰子类,然后创建一个实例,得出掷骰子1000次的结果 from random import randint import pygalclass Di ...

  3. python中的turtle如何运行_python中turtle库的简单使用教程

    python的turtle库的简单使用 Python的turtle库是一个直观有趣的图形绘制函数库,是python的标准库之一. 一.绘图坐标体系 turtle库绘制图形的基本框架:通过一个小海龟在坐 ...

  4. python tkinter库、添加gui界面_使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)...

    使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二),创建一个,界面,布局,文件,路径 使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二) ...

  5. 爬虫实战入门级教学(数据爬取->数据分析->数据存储)

    爬虫实战入门级教学(数据爬取->数据分析->数据存储) 天天刷题好累哦,来一期简单舒适的爬虫学习,小试牛刀(仅供学习交流,不足之处还请指正) 文章讲的比较细比较啰嗦,适合未接触过爬虫的新手 ...

  6. python中requests库的用途-数据爬虫(三):python中requests库使用方法详解

    有些网站访问时必须带有浏览器等信息,如果不传入headers就会报错,如下 使用 Requests 模块,上传文件也是如此简单的,文件的类型会自动进行处理: 因为12306有一个错误证书,我们那它的网 ...

  7. 爬虫实战2(上):爬取豆瓣影评

       这次我们将主要尝试利用python+requsets模拟登录豆瓣爬取复仇者联盟4影评,首先让我们了解一些模拟登录相关知识补充.本文结构如下: request模块介绍与安装 get与post方式介 ...

  8. 爬虫实战2(下):爬取豆瓣影评

       上篇笔记我详细讲诉了如何模拟登陆豆瓣,这次我们将记录模拟登陆+爬取影评(复仇者联盟4)实战.本文行文结构如下: 模拟登陆豆瓣展示 分析网址和源码爬取数据 进行面对对象重构 总结   一.模拟登陆 ...

  9. php有lambda表达式吗,Python中lambda表达式的简单介绍(附示例)

    本篇文章给大家带来的内容是关于Python中lambda表达式的简单介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一:匿名函数的定义 lambda parameter ...

最新文章

  1. C#垃圾回收(GC)
  2. 修正Android基于ZXing的二维码扫描——横竖屏自由切换
  3. 访问域名不走dns服务问题排查,报错could not resolve host
  4. php json_encode后乱码,php json_encode 中文乱码的解决方法
  5. python中封装是什么意思_Python中数据封装是什么?
  6. jdk13不能显示中文_JDK 13都发布了!你还在用JDK7吗?
  7. Mysql 表设计注意
  8. 我是这样在第一轮筛选简历的
  9. pytorch梯度的自动求取
  10. 工业机器人cloos_半年报点评:并表cloos,国内工业机器人龙头蓄势待发
  11. Jvisualvm监控远程SpringBoot项目
  12. 雾芯科技,创新者的窘境
  13. 51单片机驱动WS2811彩灯源程序方案
  14. Sentaurus training 笔记
  15. java 实现 PDF 转 TIF 【彩色压缩版】
  16. lol封号维护服务器,LOL玩家被封三年执着理论,腾讯客服是这样回复的
  17. 流量的秘密—Google Analytics网站分析与优化技巧(第2版)
  18. coso2dx-lua 电脑模拟器 , 不重启游戏 直接让修改过的 lua 代码 生效
  19. 【iOS】—— KVC与KVO
  20. 解决项目部署到阿里云服务器邮件发送失败的方法

热门文章

  1. [由零开始]Guava Cache介绍和用法
  2. 电商暴力引流 社交电商引流模式如何做到病毒式裂变获客
  3. 一个北大学子毕业后的感悟
  4. python输入框_python 输入框
  5. java 安装 jce_JDK8安装JCE解决加密限制问题
  6. 企业选择劳务派遣招聘好还是劳务外包好?
  7. 推荐一款jQuery导航栏滚动悬浮插件stickUp
  8. [ASP.NET]如何把Popup特性从宝玉的论坛代码中拆分出来呢?
  9. arcmap生成泰森多边形
  10. Linux系统进程退出与等待