字符串的重要功能之一就是正则表达式,正则表达式在各种操作中都起到了关键作用,尤其是Python标志性的功能爬虫也是以这个语法为基础建立的。所以,本篇笔记就开始简单了解一下正则表达式,顺带简单了解一下爬虫,重点:本文只作为个人笔记使用(3000字)。
一.概述
二.元字符汇总
三.重点元字符解释
1.点号“.”:
一个点号可以代替除了换行符以外的任何一个字符,包括但不限于英文字母、数字、汉字、英文标点符号和中文标点符号。
2.星号“*”:
一个星号可以表示它前面的一个子表达式(普通字符、另一个或几个正则表达式符号)0次到无限次。
3.问号“?”:
问号表示它前面的子表达式0次或者1次。注意,这里的问号是英文问号。4.
4.反斜杠“\”:
用来标志转义字符。
常见转义字符:
若要匹配的字符串中有"\"号,为了不被解释成转义字符,可以在字符串的前引号前加r。
5.数字“\d”:
正则表达式里面使用“\d”来表示一位数字,把“\d”看成一个正则表达式符号整体。
6.小括号“( )”:
小括号可以把括号里面的内容提取出来。
实质:正则字符串实质是建立一个字符串模板,在模板中建立可查询的槽,将整个字符串与模板相比较,从而得到我们在槽中设置的内容。所以,正则字符串必须有前后两个标志部分。
槽的建立:
在个人设置的正则表达式字符串模板中,槽代表我们需要寻找的东西。因此我们需要对槽进行处理,保证它能够提取出我们所需要的内容。而所采用的,就是上面元字符的组合。
即(.*)或(.*?)
(区别:“.*”表示匹配一串任意长度的字符串任意次。必须在“.*”的前后加其他的符号来限定范围否则得到的结果就是原来的整个字符串。 “.*?” 匹配一个能满足要求的最短字符串。)
边界匹配符:
重复限定符:
四.重点库介绍(re库与Request库)
正则表达式在使用时,经常需要与re库的内容进行配合,而且在用作爬虫时,还需要request库的内容。这里介绍以下两个库。
re库:
re库中常用操作:
函数调用:
注:pattern表示正则表达式,flags表示特殊功能:
match (pattern, string[, flags] ):从头开始匹配从第一个字母开始匹配,必须完全一致,有不同则匹配失败。search( pattern, string, [flags=0]) :扫描全文中并匹配第一个元素。注:以上两个函数只能每次提取一个字符串,若想要同时提取多个字符串,则需要运用下面的函数。group():对获得的目标进行分组截取(不带参数即可以提取整个匹配内容)如果要同时获取多个值,不仅要对于原字符串建立多个元字符表达式,而且在提取时也需要group()函数进行分类。+fndall(): 匹配所有元素sub(pattern,repl, string[, count]):替换操作注:在操作时,如果字符串中有特殊字符(如:(),.等),需要在每个特殊字符前加上\。split(pattern,string,maxsplit=0,flags=0) :分割字符串注:单字符分割:r';' 多字符分割:r'[;,] 空白字符切割:r'[;,\s] 括号捕获分组:r'([;])compile(pattern, flags=0) : 将正则表达式的字符串形式编译成正则表达式对象
除此以外,还有面向对象的用法:
request库:
使用爬虫时,常需要同时利用多个库,这时不需要重复写import,直接在后面 ,跟新库名即可。
request常用操作:
函数调用:
request库的实际作用就是向我们的目标网站发送请求,这也是爬虫的第一步。因此re库更偏向于正则表达式的正常使用,request库更偏向爬虫的使用。
五.正则表达式的匹配算法
贪婪算法与非贪婪算法:
贪婪即获得最多,非贪婪则就是获得最少的。即(.*)和(.*?)。
选择分支:
如果是需要多个正则表达式进匹配,可以使用 | 进行连接。
注:
- 在编写正则表达式时,不需要专门使用compile()函数,系统会自动调用。
- 先抓大,再抓小。即,先匹配大的符合正则表达式的字符串
eg:正则表达式:“<.*?>|《.*?》” 字符串:“a<you are 《my girlfriend?》 >”
输出结果为:my girlfriend
实际为,先选中了大范围的<>,再在<>中继续找到《》进行判断。
六.爬虫举例
首先,请不要随便爬虫、请不要随便爬虫、请不要随便爬虫!!!
爬虫需要遵守相关的安全协议,随便爬取有可能会涉及违法,请不要随便爬虫!!!
我们老师说:爬虫爬的好,牢饭吃的饱。记住这一点,就可以学习爬虫了。
爬虫的基本历程:
申请访问——爬取信息——正则匹配——输出结果
看着爬虫简洁明了的过程,似乎很简单,但每一步也都需要先行条件,接下来一个个介绍。
eg:以访问当当网(python-当当网)获取书目出版社为例:
首先,要得到当当网的网站地址,以字符串形式赋值给变量url。开始尝试进行爬取(请不要反复提交申请,否则易被视为攻击,反而无法得到想要的代码段),辨别爬取是否成功(成功返回200,否则返回400或其他)。
之后,为了得到源代码的模板格式以创建正则表达式,点击进入网站,右击选择检查,进入新界面后,点击
按键,再在原网站中点击自己想查询的东西会自动在新网站中跳转至源代码部分,之后复制该部分源代码,粘贴在记事本中,寻找到自己想要的内容,再找出不变的字符串前后标志。(建议多点几个查询物品找到同类源代码再辨别)之后构建正则表达式pattern。再引用相关函数编译程序即可。
ps:为防被屏蔽就不放图了。
import requests,re
url='http://search.dangdang.com/?key=python&act=input'#网站地址
reponse = requests.get(url)#发出申请
if reponse.status_code==200:#检查是否爬取成功
print('可以网页源代码')
else:
print('无法获取网页源代码')
page_code = reponse.text#获得源代码
pattern = r'<span class="search_pre_price">¥(.*?)</span>'
result = re.findall(pattern,page_code)#爬虫匹配
print(result)#输出结果
Tips:
- 请不要随便爬虫!!!
- 在代码编写完成后,运行时请勿反复点击运行按钮,以防get()函数多次运行被视为攻击
- 尽量选择允许爬虫的练习网站(用当当举例是因为其他练习的网站被访问崩了)
- 不要爬取个人隐私、机密文件等不易视人的内容
简单的爬虫到这里结束。更详细深刻的以后继续学习。下一篇,函数!
END.