正则几乎可以提取任何数据,但是特别难写,一般其他解析库不能提取的时候才使用正则
正则还可以用于数据清洗,本文案例的正则只用于简单的数据清洗
正则介绍链接:https://cuiqingcai.com/977.html
案例是上一篇(https://blog.csdn.net/jeeson_z/article/details/81279249)的 豆瓣电影Top250
上次得到的结果:
其中 '电影介绍(intro)' 的内容中包含空格、换行等,使阅读难度增大
为了阅读方便,将用正则使多行显示为一行
使用正则
用 findall() 方法查找,'\S' 表示提取所有的非空白字符,re.S表示换行提取
# 用正则提取所有的可见字符
intro = re.findall('\S', intro, re.S)
findall() 返回的是一个列表
使用 ' '.join() 方法将列表转换为字符串
# 将列表转化为字符串
intro = ''.join(intro)
结果展示:
全部代码
# 导入requests模块
import requests
# 导入BeautifulSoup模块
from bs4 import BeautifulSoup
# 导入正则re模块
import re
# 获取要爬取的网页的url
url = 'https://movie.douban.com/top250'
# 用get()方法请求下载网页
rsp = requests.get(url)
# text属性返回网页源码的内容
text = rsp.text
# 用BeautifulSoup()方法将源码内容生成能用BeautifulSoup解析的lxml格式文件
BS = BeautifulSoup(text, 'lxml')
# 用find_all()方法找到包含电影的所有标签
movies = BS.find_all(name='div', attrs={'class': 'item'})
# 遍历每一个电影信息
for movie in movies:
# 提取图片的地址信息
img = movie.find(name='img', attrs={'width': '100'}).attrs['src']
# 提取电影名字信息
name = movie.find(name='span', attrs={'class': 'title'}).string
# 提取电影介绍信息
# 注意:get_text()能提取包含有内嵌标签的信息
intro = movie.find(name='p', attrs={'class': ''}).get_text()
# 用正则提取所有的可见字符
intro = re.findall('\S', intro, re.S)
# 将列表转化为字符串
intro = ''.join(intro)
# 提取评价信息
# 注意:评价信息分别在在多个<span>里面,所以用findall()方法
star = movie.find(name='div', attrs={'class': 'star'}).find_all(name='span')
# 获取评分
score = star[1].string
# 获取评价人数
fans_num = star[3].string
# 获取引语
quote = movie.find(name='span', attrs={'class': 'inq'}).string
# 用open()方法创建一个名为‘Top250’的‘txt’文件
with open('Top250.txt', 'a', encoding='utf-8') as f:
# 用write()方法写入内容
f.write('img:'+img+' name:'+name+' intro:'+intro+' score:'+score+' fans_num:'+fans_num+' quote:'+quote + '\n')