一、问题描述
上篇文章中描述了获取整个网页的html信息代码,可我们就只想获取我们想要的那部分信息,该怎么办呢?
二、问题思路
- 引入所需数据库
- 先将数据进行拆分
- 再进行数据的解析
三、问题解决
以获取豆瓣第一个网页电影信息(影片详情连接、影片图片、影片片名、影片评价、评价人数、电影概况、影片相关内容)为例
import urllib.request # 获取整个网页信息所需库
from bs4 import BeautifulSoup # 数据拆分所需库
import re # 数据解析所需库
# 一. 获取整个网页的html
#得到指定一个URL的网页内容
#方法一:获取一个get请求
# HTTP Error 418:对方已发现我是一个爬虫,所以要进行伪装
url = "https://movie.douban.com/top250?start="
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
} #模拟头部信息,向服务器发送消息
req = urllib.request.Request(url=url,headers=headers)#封装
try:
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8') #对获取网页进行utf-8的解码
#print(html)
except urllib.error.URLError as e: #try except 进行超时设置
print("timeout")
# 二:对整个网页进行数据拆分与数据解析
datalist = []
soup = BeautifulSoup(html,"html.parser")
for item in soup.find_all("div", class_="item"):
#print(item)#测试:查看电影item全部信息
data = [] #保存一部电影的所有信息
item = str(item)
# 1.影片详情链接规则
findLink = re.compile(r'<a href="(.*?)">') # 创建正则表达式对象,表示规则(字符串的模式)
#添加影片详情连接
link = re.findall(findLink,item)[0] #re库用来通过正则表达式查找指定的字符串
#j将findLink放入全局变量里定义
data.append(link)
#print(link)
# 2.影片图片规则
findImageSrc = re.compile(r'<img.*src="(.*?)"', re.S) # re.S让换行符包含在字符中
#添加影片图片
imageSrc = re.findall(findImageSrc,item)[0]
data.append(imageSrc)
#print(imageSrc)
# 3.影片片名规则
findTitle = re.compile(r'span class="title">(.*)</span>')
#添加影片片名
title = re.findall(findTitle,item)#[0] 错误
if (len(title) == 2):
ctitle = title[0]
data.append(ctitle) #添加中文名
otitle = title[1].replace("/","") #去掉无关的符号
data.append(otitle) #添加外国名
else:
data.append(title[0])
data.append(' ') #外国名可能没有,则留空
# 4.影片评分规则
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#添加评分
rating = re.findall(findRating,item)[0]
data.append(rating)
# 5.找到评价人数规则
findJudge = re.compile(r'<span>(\d*)人评价</span>')
#添加评价人数
judge = re.findall(findJudge,item)[0]
data.append(judge)
# 6.电影概况规则
findInq = re.compile(r'<span class="inq">(.*)</span>', )
# 添加电影概况
inq = re.findall(findInq,item)
if len(inq) != 0: #这里报错
inq = inq[0].replace("。","") #去掉句号
data.append(inq)
else:
data.append(" ") #留空
# 7.影片相关内容
findBd = re.compile(r'<p class="">(.*?)</p>', re.S)
# 添加影片相关内容
bd = re.findall(findBd,item)[0]
bd = re.sub('<br(\s+)?/>(\s+)?'," ",bd) #去掉<br/>
bd = re.sub('/'," ",bd) #去掉/
data.append(bd.strip()) #去掉前后的空格
datalist.append(data)
print(datalist) #打印所有过滤掉的信息
程序运行结果: