16正则表达式函数
re.match()
re.search()
re.sub()
1.re.match()函数
相比于search匹配,match只能从开头开始匹配
import re
# +的使用和*的使用,
string='thonyjsdkajsdpoy'
pat='p.*y'
result=re.match(pat,string,re.I)#模式修正符,忽略大小写
print(result)
结果是匹配不到的,因为开头没有匹配到,后面出现也不行
None
2.re.conpile()函数
格式re.compile(‘正则表达式’).findall(‘所有数据’)
import re
# +的使用和*的使用,
string='thpnyjsdpooooykajsdpoy'
pat='p.*?y'
result=re.compile(pat).findall(string)
print(result)
最后,result变成了一个列表
['pny', 'pooooy', 'poy']
17常见正则实例讲解
#实例1:匹配.com 和.cn网址
string=" < a href=‘http://www.baidu.com ’ >百度首页< /a>’ "
import re
# +的使用和*的使用,
string="<a href='ftp://www.baidu.com'>百度首页</a>'"
pat="[a-zA-Z]+://[^\s]*[.com|.cn]"
result=re.compile(pat).findall(string)
print(result)
运行结果,.com或.cn择其一,^\s表任意
['ftp://www.baidu.com']
#实例2,匹配电话号码,注意使用{ }而不是[ ]
" \d[4]-\d[7]|\d[3]-\d[8]"
import re
string = "aksdjlaskjd021-54687549232132ajsh6791-32132132132574kjsdka"
pat = "\d{4}-\d{7}|\d{3}-\d{8}"
result = re.compile(pat).findall(string)
print(result)
运行结果
['021-54687549', '6791-3213213']
18 简单的爬虫
1.爬csdn网页
urllib.request
import urllib.request
data=urllib.request.urlopen('https://www.csdn.net/').read()
print(data)
2.从网页中提取出qq群
https://edu.csdn.net/huiyiCourse/detail/253
页面链接
import urllib.request
import re
data=urllib.request.urlopen('http://edu.csdn.net/huiyiCourse/detail/253').read().decode('utf-8')
pat='<p>(\d*?)</p>'
result=re.compile(pat).findall(data)
print(result)
运行结果
[‘433597240’]
注意,decode('utf-8)是对页面进行转码
然后在网页上查看源码,找到左下角那一块的代码 < p >开头和结尾的东西
对于上面写的正砸表达式,小括号如果有,显示出来的是小括号内的东西,没有就显示整条正则表达式出来
import urllib.request
import re#用decode来解码
data=urllib.request.urlopen("https://read.douban.com/provider/all").read().decode('utf-8')
pat='<div class="name">(.*?)</div>'
result=re.compile(pat).findall(data)
print(result)
下面爬出版社
但是会出现下面这种情况,是因为爬虫被拒绝了
Traceback (most recent call last):
File "D:/pycharm222/001.py", line 3, in <module>
data=urllib.request.urlopen('https://read.douban.com/provider/all').read().decode('utf-8')
File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\urllib\request.py", line 223, in urlopen
return opener.open(url, data, timeout)
File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\urllib\request.py", line 532, in open
response = meth(req, response)
File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\urllib\request.py", line 642, in http_response
'http', request, response, code, msg, hdrs)
File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\urllib\request.py", line 570, in error
return self._call_chain(*args)
File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\urllib\request.py", line 504, in _call_chain
result = func(*args)
File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\urllib\request.py", line 650, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 418:
所以可以尝试在请求中加入UserAgent的信息
分析:之所以出现上面的异常,是因为如果用 urllib.request.urlopen 方式打开一个URL,服务器端只会收到一个单纯的对于该页面访问的请求,但是服务器并不知道发送这个请求使用的浏览器,操作系统,硬件平台等信息,而缺失这些信息的请求往往都是非正常的访问,例如爬虫.
有些网站为了防止这种非正常的访问,会验证请求信息中的UserAgent(它的信息包括硬件平台、系统软件、应用软件和用户个人偏好),如果UserAgent存在异常或者是不存在,那么这次请求将会被拒绝(如上错误信息所示)
网上找了找链接,推荐使用这个替换原开头
headers = {‘User-Agent’:‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0’}
req = urllib.request.Request(url=‘目标网址’, headers=headers)
urllib.request.urlopen(req).read()
原文参考链接点这里
从网页上找到正则表达式的样式,然后自己写出正则的样式(还需要再琢磨怎么写!!)
下面是成功运行的代码,而且成功存储在D盘的文件中了
import urllib.request
import re
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
req = urllib.request.Request(url='https://read.douban.com/provider/all', headers=headers)
data=urllib.request.urlopen(req).read().decode('utf-8')
print(len(data))
pat='<div class="name">(.*?)</div>'
result=re.compile(pat).findall(data)
print(result)
fh=open('D:/pycharm222/bookname.txt','w')
for i in range(0,len(data)):
print(result[i])
fh.write(result[i]+'\n')
fh.close()
来源:CSDN
作者:小写的派大星
链接:https://blog.csdn.net/qq_43557329/article/details/104025013