1.正则表达式
下面先给出一个简单的示例:
^ 为匹配输入字符串的开始位置。
[0-9]+匹配多个数字, [0-9] 匹配单个数字,+ 匹配一个或者多个。
abc$匹配字母 abc 并以 abc 结尾,$ 为匹配输入字符串的结束位置。
re 模块使 Python 语言拥有全部的正则表达式功能。
(1)re.match函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
# 语法:re.match(pattern, string, flags=0)
import re
print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配
(2)re.search方法
re.search 扫描整个字符串并返回第一个成功的匹配。
re.search(pattern, string, flags=0)
re.match与re.search的区别:
re.match只匹配字符串的开始,而re.search匹配整个字符串,直到找到一个匹配。
2. 检索和替换
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。
re.sub(pattern, repl, string, count=0, flags=0)
参数:
- pattern : 正则中的模式字符串。
- repl : 替换的字符串,也可为一个函数。
- string : 要被查找替换的原始字符串。
- count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
re.compile 函数:
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。 语法格式为:
re.compile(pattern[, flags])
3.结合requests、re两者的内容爬取豆瓣电影 Top 250里的内容
要求:抓取名次、影片名称、国家、导演等字段。
import requests # 导入requests库
import re # 导入正则表达式
import time
def loadPage(url):
'''
访问目标地址,并返回网页源代码
'''
response = requests.get(url=url).content # 访问目标网址
response = str(response, 'utf-8')
return response
def match(rule, html):
'''
利用正则表达式从源代码中匹配想要获取的内容
'''
result = re.findall(rule,html)
return result
def dataSave(datas):
'''
将获得的数据写入txt文档
'''
for data in datas:
with open("豆瓣Top250.txt", 'a', encoding='utf-8') as f:
f.write(data)
def main():
'''
250个电影,一页显示25个,总共10页,即url地址start=后累加9次
'''
# 添加浏览器用户代理
# hearders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
# "Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0"
# }
url = "https://movie.douban.com/top250?start=" # 豆瓣top250网址,strart=后面加页数,比如第一页就是0,第二页是25,每次累加25
rules = r'<div class="hd">([\d\D]*)</li>' # 正则表达式匹配电影信息
for i in range(10):
whole_url = url + str(i*25)
print("正在获取第%d页" %(i+1))
content = loadPage(whole_url) # 获取每一页的内容
datas = match(rules, content) # 获取电影内容
dataSave(datas) # 将数据写入文件
time.sleep(3) # 每获取一页等3s后再获取下一页
if __name__ == '__main__':
main()