python爬虫只能输出网页中的第一条信息

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]#多行匹配,下同。
...