要想做爬虫,不可避免的要用到正则表达式,如果是简单的字符串处理,类似于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. Python 内置函数 day4

    import random s = 'abczfg' st= {3,4,9,1,8} print(dir(random))#打印模块内的方法,输出模块/变量可以调用的方法 print(dir(s))# ...

  2. 直流电机PWM调速系统中控制电压非线性研究_控制元件_工业自动化控制_文章

    直流电机PWM调速系统中控制电压非线性研究_控制元件_工业自动化控制_文章_e-works数字化企业网 http://articles.e-works.net.cn/Component/Article ...

  3. JavaScript学习笔记之BOM对象

    目录 1.Window 2.Window Screen 3.Window Location 4.Window History 5.Window Navigator 浏览器对象模型(Browser Ob ...

  4. 10.多shard场景下relevence score可能不准确

    主要知识点 多shard场景下relevence score可能不准确的原因 多shard场景下relevence score可能不准确解决方式     一.多shard场景下relevance sc ...

  5. Python基础-while奇数和

    利用while循环计算100*座位号 以内奇数的和. n = 1 s = 0 SeatID=1 while n <= 100*SeatID: s += n n += 2 print '奇数的和: ...

  6. Linxu基础入门

    Linux命令大全:http://man.linuxde.net/ 创建目录 使用 mkdir 命令创建目录 mkdir $HOME/testFolder 切换目录 使用 cd 命令切换目录 cd $ ...

  7. fzu 2129

    第i个元素a未出现过:dp[i] = (2 * dp[i-1] + 1) % mod; visit[a]代表a最后出现的位置 第i个元素a出现过:dp[i] = (2 * dp[i-1] - dp[v ...

  8. NFS 文件系统的搭建

    教程: 一.配置linux内核: 进入打过at91补丁的linux2.6内核源代码树的根目录 make menuconfig进入内核配置程序. 1.  Networking ---> Netwo ...

  9. C++ primer chapter 13

    拷贝 赋值 销毁 拷贝构造函数 如果一个构造函数第一个参数是自身的引用,而且任何额外参数都有默认值,则此构造函数是拷贝构造函数拷贝构造函数的第一个类型必须是引用:如果参数不是引用类型,那么调用不会成功 ...

  10. HDOJ 5417 Victor and Machine 水

    Victor and Machine Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Othe ...