要想做爬虫,不可避免的要用到正则表达式,如果是简单的字符串处理,类似于split,substring等等就足够了,可是涉及到比较复杂的匹配,当然是正则的天下,不过正则好像好烦人的样子,那么如何做呢,熟记正则元字符和语法,找个在线匹配测试网站随时测试(其实在正则上我也是个菜逼。。。一直在慢(询)慢(问)测(大)试(牛)中得到正解),不过要相信,用熟了自然就巧了!

  首先,推荐两篇博客,分别介绍了python自带的正则标准库re以及regex模块:Python正则表达式指南(re)     Python的regex模块——更强大的正则表达式引擎。而我呢,最不擅长总结各种库各种语法之类的了,本篇博客就稍微简单介绍常用的以及爬虫程序开发过程中的小例子!先说说比较常用的6个re中的函数:

  re.compile(pattern,flag)#根据正则匹配字符串以及附加条件,返回一个pattern对象

  re.search(pattern,string)#搜索整个字符串,知道发现符合正则表达式的字符串

  re.match(pattern,string)#从头开始检测字符串是否符合正则表达式,必须从字符串的第一个字符开始

  re.sub(pattern,replacement,string)#将字符串中根据正则匹配到的字符串用replacement替换

  re.split(pattern,string)#根据正则表达式分割字符串,将分割后的字符串放到list中返回

  re.findall(pattern,string)#根据正则表达式分割字符串,将找到的所有结果放到list中返回

  python中的匹配默认是贪婪的,所谓贪婪就是尝试尽可能的匹配更多的字符,比如:正则表达式"ab*"如果用于查找字符串"abbbc",将找到"abbb",如果是非贪婪的呢,得到的结果就是"a"。同样有时候我们时刻要注意转义字符等等,在net中我们有@,在python中我们有r,用法一样哦。让我们先来看一段代码:

 >>> import re
>>>
>>> pattern = re.compile(r'hello',re.I)
>>> match = pattern.match('Hello World@!')
>>> if match:
... print match.group()
...
Hello
>>>

  在上面的代码中,我们先生成了一个pattern对象,然后进行了匹配,其中re.compile函数中,我们的re.I就是附带条件:忽略大小写。其他模式可以自行搜索之,各种模式之间可以互相配合。其实我们可以放弃用re.compile函数而直接这么写:

 >>> match = re.match('hello','hello world!')
>>> print match.group()
hello

  这样做少了一行re.compile(pattern,flags)代码,但是也少了pattern的对象,各位如何使用之就仁者见仁智者见智吧。

  python中还可以对正则匹配的返回结果进行进一步的控制,如:

 >>> import re
>>> m = re.search("output_(\d{4})","output_2016.txt")
>>> print m.group()
output_2016
>>> print m.group(1)
2016
>>> print m.groups()
('',)

  可以看到,我们的正则表达式output_(\d{4}) 其中包含一个正则表达式(\d{4}),像这样被括号圈起来的正则表达式的一部分,我们称之为群(group),我们可以用m.group(index)来查询,group(0)是整个正则表达式的搜索结果,group(1)是第一个群,以此类推。。。。也许这样看着并不方便,我们可以对群起名字:

>>> import re
>>> m = re.search("(?P<year>\d{4})\.(?P<mon>\d{2})\.(?P<day>\d{2})","output_2016.01.18.txt")
>>> m.groups()
('', '', '')
>>> m.groupdict()
{'year': '', 'mon': '', 'day': ''}
>>> m.group("year")
''
>>> m.group("mon")
''
>>> m.group("day")
''

  让我们看个实例:有一个文件,文件名为output_2016.01.18.txt。请读取文件名中的日期时间信息,计算出当日是星期几,并将文件名修改为output_yyyy-mm-dd-w.txt,其中w为星期几。

 import os,re,datetime
filename="output_1981.10.21.txt"
get_time=re.search("(?P<year>\d{4})\.(?P<month>\d{2})\.(?P<day>\d{2})\.",filename)
year=get_time.group("year")
month=get_time.group("month")
day=get_time.group("day")
date=datetime.date(int(year),int(month),int(day))
wd=date.weekday()+1
os.rename(filename,"output_"+year+"-"+month+"-"+day+"-"+str(wd)+".txt")

  好了,正则基础就介绍到这里了,接下来让我们试着进行一下爬虫中的正则表达式。讲个小例子:什么值得买的白菜价包邮信息。

  什么值得买——白菜价

  要爬取网页信息,除了我们要得到网页信息外最重要的就是把我们需要的信息提取出来,我们f12来看一下要提取的html代码:

  我们看到我们想要得到的信息都在<h2 class="itemName">...</h2>之中。我们的正则表达式如下:

 content = response.read().decode('utf-8')
pattern = re.compile('<h2 .*?itemName"><a.*?<span .*?black">(.*?)</span><span .*?red">(.*?)</span></a></h2>',re.S)
items = re.findall(pattern,content)
for item in items:
print item[0],item[1]

  .*?是一个固定搭配,.和*可以匹配任意多个字符,加上?就是最小匹配,也就是我们上面说的非贪婪模式。直白的说就是匹配尽可能短的字符串。

  (.*?)这个上面我们讲了,他是正则匹配时的一个群。re.S标志在正则匹配的时候为点任意匹配模式,即点可以代表任意字符比如换行符。这样我们就获得了每个商品的名称和价格。(整个爬虫源码在下一篇博客)

自学Python六 爬虫基础必不可少的正则的更多相关文章

  1. 自学Python四 爬虫基础知识储备

    首先,推荐两个关于python爬虫不错的博客:Python爬虫入门教程专栏   和 Python爬虫学习系列教程 .写的都非常不错,我学习到了很多东西!在此,我就我看到的学到的进行总结一下! 爬虫就是 ...

  2. 自学Python五 爬虫基础练习之SmartQQ协议

    BAT站在中国互联网的顶端,引导着中国互联网的发展走向...既受到了多数程序员的关注,也在被我们所惦记着... 关于SmartQQ的协议来自HexBlog,根据他的博客我自己也一步一步的去分析,去尝试 ...

  3. python从爬虫基础到爬取网络小说实例

    一.爬虫基础 1.1 requests类 1.1.1 request的7个方法 requests.request() 实例化一个对象,拥有以下方法 requests.get(url, *args) r ...

  4. Python扫描器-爬虫基础

    0x1.基础框架原理 1.1.爬虫基础 爬虫程序主要原理就是模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中 1.1.基础原理 1.发起HTTP请求 2 ...

  5. Python BeautifulSoup4 爬虫基础、多线程学习

    针对 崔庆才老师 的 https://ssr1.scrape.center 的爬虫基础练习.Threading多线程库.Time库.json库.BeautifulSoup4 爬虫库.py基本语法

  6. 开发记录_自学Python写爬虫程序爬取csdn个人博客信息

    每天刷开csdn的博客,看到一整个页面,其实对我而言,我只想看看访问量有没有上涨而已... 于是萌生了一个想法: 想写一个爬虫程序把csdn博客上边的访问量和评论数都爬下来. 打算通过网络各种搜集资料 ...

  7. 自学Python十 爬虫实战三(美女福利续)

    我又来送福利啦!!!不同于上篇文章,这次我们的爬虫采用了多线程,一直以来被所谓的分布式  多线程  爬虫 给唬的怕怕的.今天就来一发多线程爬虫吧,还能看妹子图,想想就觉得很激动!!! 依然是流程解释: ...

  8. 自学Python九 爬虫实战二(美图福利)

    作为一个新世纪有思想有文化有道德时刻准备着的屌丝男青年,在现在这样一个社会中,心疼我大慢播抵制大百度的前提下,没事儿上上网逛逛YY看看斗鱼翻翻美女图片那是必不可少的,可是美图虽多翻页费劲!今天我们就搞 ...

  9. 自学Python七 爬虫实战一

    此文承接上文,让我们写一个简简单单的爬虫,循序而渐进不是吗?此次进行的练习是爬取前5页什么值得买网站中的白菜价包邮信息.包括名称,价格,推荐人,时间. 我们所需要做的工作:1.确定URL并获得页面代码 ...

随机推荐

  1. 前端自动化构建工具gulp使用

    1. 全局安装 gulp: $ npm install --global gulp 2. 作为项目的开发依赖(devDependencies)安装: $ npm install --save-dev ...

  2. redis在linux下安装以及扩展

    安装过redis后发现回头忘了,今天重新安装记录下 首先 我是在home下创建redis文件   mkdir  redis 然后直接用wget安装 wget http://download.redis ...

  3. c/c++排坑(4) -- c/c++中返回局部变量

    返回c语言中的局部变量 先看一段代码猜猜,打印值: #include <iostream> using namespace std; char * func(); int main() { ...

  4. CentOS7.2下安装php加速软件Xcache

    说明: php安装目录:/usr/local/php php.ini配置文件路径:/usr/local/php/etc/php.ini Nginx安装目录:/usr/local/nginx Nginx ...

  5. render: h => h(App) $mount 什么意思

    初始一个vue.js项目时,常常发现main.js里有如下代码: new Vue({ render: h => h(App) }).$mount('#app') 这什么意思?那我自己做项目怎么改 ...

  6. camera placement (paraview)

    # 'renderView1' is the view name# current camera placement for renderView1 renderView1.CameraPositio ...

  7. NLTK学习笔记(七):文本信息提取

    目录 实体识别:分块技术 分块语法的构建 树状图 IOB标记 开发和评估分块器 命名实体识别和信息提取 如何构建一个系统,用于从非结构化的文本中提取结构化的信息和数据?哪些方法使用这类行为?哪些语料库 ...

  8. 在Docker上构建mysql容器

    1.查看docker上的镜像是否有 mysql,如果没有下载则列表中没有  [root@holly holly]# docker images; 如果没有只会看到如下结构 REPOSITORY  TA ...

  9. 00110_Class类

    1.Class 对象是在加载类时由 Java虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的: 2.获取Class对象的三种方式 (1)方式一:通过Object类中的getObj ...

  10. HDU 5442 Favorite Donut

    Favorite Donut Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...