python爬虫猫眼电影评论评分,用正则表达式匹配HTML元素值并输出成柱状图

  • Post author:
  • Post category:python


首先目标是爬虫电影评论和评分,随机点开最近大火的

《狮子王》的猫眼评论

,确定评论所在html元素位置:

在这里插入图片描述

具体是:

<div class="main">
    <div class="main-header clearfix">
        <div class="user">
            <span class="name">影子内阁、</span>

            <span class="tag"></span>
        </div>
        <div class="time" title="2019-07-12 03:02:48">
            <span title="2019-07-12 03:02:48">4天前</span>
            <ul class="score-star clearfix" data-score="4">
                <li>
                    <i class="half-star left active"></i><i class="half-star right active"></i> </li>
                <li>
                    <i class="half-star left active"></i><i class="half-star right active"></i> </li>
                <li>
                    <i class="half-star left "></i><i class="half-star right "></i> </li>
                <li>
                    <i class="half-star left "></i><i class="half-star right "></i> </li>
                <li>
                    <i class="half-star left "></i><i class="half-star right "></i> </li>
            </ul>

        </div>
        <div class="approve " data-id="1071060270">
            <i data-act="comment-approve-click" class="approve-icon"></i><span class="num">345</span>
        </div>
    </div>
    <div class="comment-content">
        给个中肯分,毕竟迪斯尼在对于动物表情语言研究上面花了大功夫,为了这两个小时的CG动物世界,迪士尼也够拼了的,childish,和碧姐等歌星撑起歌声,黑人兄弟撑起诙谐片段,已经把声音的枯燥感压到最低,但是也会有汉斯季默救不回来片子,一切就毁在过度追求CG实感,而忽略了真正的狮子王原版动画中很多的有点,看得要睡着了。而成功事例就是阿拉丁,任务定位和感情线,都很完美,盖里奇完全用原本的风格,用自己的语言,又说了一边阿拉丁的故事,但这次这个故事,多多少少有盖里奇的影子,也很完整~
    </div>
</div>

根据网页中html元素的定位来获取我们需要的值,我们需要了解

1).

? 是一个固定的搭配,.和

代表可以匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是我们会尽可能短地做匹配(. * ?)代表一个分组

2)re.S 标志代表在匹配时为点任意匹配模式,点 . 也可以代表换行符

3)(\d{1,2})表示匹配1到2个数字,因为评分是1~10,这里不用(. * ?)是因为会匹配到空值

以下是完整代码:

# -*- coding: utf-8 -*-
# import requests
import re
from bs4 import BeautifulSoup
from  urllib.request import urlopen

soup = BeautifulSoup(urlopen('https://maoyan.com/films/1189879'),'lxml')

for data in soup.select('.main'):
    data = str(data)
    #不转换成str会报错:TypeError: expected string or bytes-like object
    pattern3 = re.compile(r'<span.*?class=\"name\">(.*?)</span>',re.S)
    name=re.findall(pattern3,data)
    print("评论人:%s"%name)

    pattern1 = re.compile(r'<ul.*?class=\"score-star.*?clearfix\".*?data-score=\"(\d{1,2})\">',re.S)
    score=re.findall(pattern1,data)
    print("评分是:%s"%score)

    pattern2 = re.compile(r'<div.*?class=\"comment-content\">(.*?)</div>',re.S)
    comment=re.findall(pattern2,data)
    print("评论是:%s\n"%comment) 

输出结果:

在这里插入图片描述

现在需要将获得的评分通过图表来显示,决定用评论人为x轴,评分为Y轴的柱状图显示,

修改后代码如下:

# -*- coding: utf-8 -*-
import re
from bs4 import BeautifulSoup
from  urllib.request import urlopen
import matplotlib.pyplot as plt
import seaborn as sns

plt.rcParams['font.sans-serif']=['SimHei','Times New Roman'] # 用来正常显示中文标签

soup = BeautifulSoup(urlopen('https://maoyan.com/films/1189879'),'lxml')
soup=str(soup)

pattern1 = re.compile(r'<ul.*?class=\"score-star.*?clearfix\".*?data-score=\"(\d{1,2})\">',re.S)
score=re.findall(pattern1,soup)
score = list(map(int, score))#将list数据转换成int类型
print(score)

pattern3 = re.compile(r'<div.*?class=\"user\">.*?<span.*?class=\"name\">(.*?)</span>',re.S)
name=re.findall(pattern3,soup)
print(name)

plt.xticks(rotation=60)#rotation表示标签逆时针旋转60度
sns.barplot(x=name, y=score)

输出图片如下:

在这里插入图片描述
在这里插入图片描述



版权声明:本文为qq_32392597原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。