python爬虫整体的item输出可以输出全部信息,但加上正则表达式后datalist就只能输出第一条信息。
#爬取网页
def getData(baseurl): #15天的天气数据
datalist = []
html = askUrl(baseurl)
# 解析数据(一边爬取一边解析数据)
soup = BeautifulSoup(html,"html.parser")
# 查找符合要求的字符串,形成列表
for item in soup.find_all('ul',class_="t clearfix"): # 15天item信息
data = [] # 保存一部电影最终要找的所有信息
item = str(item)
# print(item)
# 模式:后面需要给指定字符串的规则
#日期
date = re.findall(findTime,item)[0] # 根据findLink在item中查找到的第一个字符串就是想要的链接
data.append(date)
#天气
weather = re.findall(findWea,item)[0]
data.append(weather)
#最高温
HighTem = re.findall(findHighTem,item)[0]
data.append(HighTem)
LowTem = re.findall(findLowTem,item)[0]
data.append(LowTem)
wind = re.findall(findWind,item)[0]
data.append(wind)
windLevel = re.findall(findWindLevel,item)[0]
data.append(windLevel)
datalist.append(data)
print(datalist)
return datalist # 返回爬取到的数据列表
是模仿课程当中老师的代码写的,老师的代码就没有问题,可以输出一个页面中的所有信息
#爬取网页
def getData(baseurl):
datalist = []
# 测试只执行第一页
html = askUrl(baseurl)
'''
# for循环获取多个页面的数据(start=i*25)
for i in range(0,10): # 调用获取信息的函数10次
url = baseurl + str(i*25) # 强制转换为字符串类型
html = askUrl(url) # 保存函数返回值
'''
# 解析数据(一边爬取一边解析数据)
soup = BeautifulSoup(html,"html.parser")
# 查找符合要求的字符串,形成列表
for item in soup.find_all('div',class_="item"): #找一个div,class属性是item
# print(item)
data = [] # 保存一部电影最终要找的所有信息
item = str(item)
#获取影片超链接
link = re.findall(findlink,item)[0] #根据findLink在item中查找到的第一个字符串就是想要的链接
data.append(link)
#获取剧照
Img = re.findall(findImg, item)[0] # 根据findLink在item中查找到的第一个字符串就是想要的链接
data.append(Img)
#电影名称
titles = re.findall(findTitle, item) # 片名可能只有一个中文名,没有外国名
if (len(titles) == 2):
ctitle = titles[0] # 添加中文名
data.append(ctitle)
otitle = titles[1].replace("/", "") # 去掉无关的符号
data.append(otitle) # 添加外国名
else:
data.append(titles[0])
data.append(' ') # 外国名字留空
#打分
Score = re.findall(findScore, item)[0] # 根据findLink在item中查找到的第一个字符串就是想要的链接
data.append(Score)
print(Score)
#人数
judgeNum = re.findall(findPer,item)[0]
data.append(judgeNum)
# 添加概述
inq = re.findall(findInq, item)
if len(inq) != 0:
inq = inq[0].replace("。", "") # 去掉句号
data.append(inq)
else:
data.append(' ') # 留空
# 演职员表
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) #把处理好的一部电影信息放入datalist
# print(datalist)
return datalist # 返回爬取到的数据列表
主要问题是你每次都是将第一条数据添加进datalist。你用的索引为[0]。
你可以尝试修改一下for语句,为:for i,item in enumerate(soup.find_all('ul',class_="t clearfix")):
在代码中将所有的索引均改为[i],试试看能否解决你的问题。
这样改一下。
def getData(baseurl): # 15天的天气数据
datalist = []
html = askUrl(baseurl)
# 解析数据(一边爬取一边解析数据)
soup = BeautifulSoup(html, "html.parser")
# 查找符合要求的字符串,形成列表
for i,item in enumerate(soup.find_all('ul', class_="t clearfix")): # 15天item信息
item = str(item)
# print(item)
# 模式:后面需要给指定字符串的规则
#日期
# 根据findLink在item中查找到的第一个字符串就是想要的链接
date = re.findall(findTime, item)[i]
#天气
weather = re.findall(findWea, item)[i]
#最高温
HighTem = re.findall(findHighTem, item)[i]
LowTem = re.findall(findLowTem, item)[i]
wind = re.findall(findWind, item)[i]
windLevel = re.findall(findWindLevel, item)[i]
datalist.append([date,weather,HighTem,LowTem,wind,windLevel])
print(datalist)
return datalist
在你的原代码中对findall()添加标志位参数,re.M进行多行匹配,看能否解决问题。
date = re.findall(findTime, item,re.M)[0]#多行匹配,下同。
...