要想做爬虫,不可避免的要用到正则表达式,如果是简单的字符串处理,类似于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. BZOJ 3489: A simple rmq problem KDtree

    Code: #include<bits/stdc++.h> #define maxn 200000 #define inf 100000000 #define mid ((l+r)> ...

  2. 小实例 hangman game

    代码 #include <bits/stdc++.h> using namespace std; int bk[110]; string sj(int t) { string ans=&q ...

  3. LOJ 6145 Easy (动态点分治+线段树)

    题目传送门 先建出来点分树,以每个点为根开线段树,维护点分子树内编号为$[l,r]$的儿子到根的距离最小值 每次查询$x$开始,沿着点分树向上跑,在每个点的线段树的$[l,r]$区间里都查一遍取$mi ...

  4. 121. Best Time to Buy and Sell Stock(动态规划)

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...

  5. jdk8--collect总结

    https://blog.csdn.net/u014351782/article/details/53818430 一,collect是一个终端操作,它接收的参数是将流中的元素累积到汇总结果的各种方式 ...

  6. 【Codeforces 467C】George and Job

    [链接] 我是链接,点我呀:) [题意] 让你从1..n这n个数字中 选出来k个不相交的长度为m的区间 然后这个k个区间的和最大 求出这k个区间的和的最大值 [题解] 设dp[i][j]表示前i个数字 ...

  7. Linux学习总结(3)——Linux实用工具

    1. Windows下同步Linux文件(Linux安装Samba和配置) 场景需求: 安装了Ubuntu在虚拟机上,但是代码编辑或者其它更多的操作的时候,还是习惯在windows下进行.如果wind ...

  8. elasticsearch match和match_phrase匹配原则(十)

    分词测试 分词后倒排索引结果:可以通过http://127.0.0.1:9200/_analyze 测试 { "analyzer":"ik_max_word", ...

  9. noip模拟赛 逃避

    题目描述 给定一篇只含有大小写字母,空格以及 ′.′(不含引号)的长度为 L 的文章.文章被若干个 ′.′ 划分 成若干个句子,句子被若干个空格划分成单词.你需要将文章中每个句子第一个单词的首字母改成 ...

  10. 运维系列之一 Linux的文件与目录权限解析

    在Linux中,万事万物皆文件,普通文件是文件,目录是文件,硬件设备也是文件,因此学习了解Linux中的文件非常重要. Linux中有三种文件类型: (1) 普通文件:又分为文本文件和二进制文件 (2 ...