目标:
1. 获取 https://ssr1.scrape.center/ 页面的电影信息(共10条)
2. 信息包括 名称,类别,上映时间,评分
3. 结果保存到movies.txt
代码:
import requests
import re
url = 'https://ssr1.scrape.center/'
# 获取页面内容content content为需要解析的内容
content = requests.get(url).text
# re.findall('<h2.*?>(.*?)', content)获取括号表达式中的内容 结果是一个列表
names = re.findall('<h2.*?>(.*?)', content, re.S)
#三个空列表存储数据
categories = []
published_at = []
scores = []
for name in names:
# 正则语法 用来匹配包含categories, published_at, score的字符串
regular_expression = '>{}.*?p>'.format(name)
# 找到包含categories,published_at,score的字符串
string = re.search(regular_expression, content, re.S).group() print(string)
# 找到categories 形成列表
categories.append(re.findall('(.*?)', string))
# 找到published_at 形成列表 注意某些电影的上映日期为空 进行判断 否则程序出错
pub_date = re.search('\\d{4}-\\d{2}-\\d{2}', string).group() \
if re.search('\\d{4}-\\d{2}-\\d{2}', string) else None
published_at.append(pub_date)
# 找到score 形成列表
scores.append(re.search('\\d\\.\\d', string).group())
# 数据保存到txt文件
fp = open('movies.txt', 'w', encoding='utf-8')
for i in range(len(names)):
fp.write(f'名称: {names[i]}\n类别: {categories[i]}\n \
上映时间: {published_at[i]}\n评分: {scores[i]}\n')
fp.write('=='*30) fp.write('\n')
总结:
1.正则匹配非常容易出错 主要是匹配的范围比预想的大
2.匹配 "." 需要转义