• 【Python爬虫实战--3】html写正则表达式


    以下是要爬虫的html内容:

    <div class="article block untagged mb15" id='qiushi_tag_113452216'>
    
    <div class="author">
    <a href="/users/30450374" target="_blank">
    <img src="http://pic.qiushibaike.com/system/avtnew/3045/30450374/medium/20151014094231.jpg" />
    本宫不服
    </a>
    </div>
    <div class="content"> 这是镇上一条偏僻路上的一家小饭馆,老板是一对老夫妻,开店几十年了,每次中午路过都要在这吃,满满的实惠。虽然饭店看着挺破败,但菜什么都很干净,因为挺偏的路上,人流较少,菜备的不多,有的菜都现洗。最重要的是价格,特实惠,在镇上其它饭店吃饭,鸡,鱼,价格18元,素菜8元。还不多,土豆炖肉28,只见土豆不见肉。而这家,红烧肉15一盘。全是肉,炒鸡块10元,红烧扁鱼12,素肉5元。这一大碗有肉圆,蘑菇,肉皮等的汤才7元 <!--1445510496--> </div> <div class="thumb"> <a href="/article/113452216" target="_blank"> <img src="http://pic.qiushibaike.com/system/pictures/11345/113452216/medium/app113452216.jpg" alt="这是镇上一条偏僻路上的一家小饭馆" /> </a> </div> <div class="stats"> <span class="stats-vote"><i class="number">491</i> 好笑</span> <span class="stats-comments"> <span class="dash"> · </span> <a href="/article/113452216" data-share="/article/113452216" id="c-113452216" class="qiushi_comments" target="_blank"> <i class="number">97</i> 评论 </a> </span> </div> <div id="qiushi_counts_113452216" class="stats-buttons bar clearfix"> <ul class="clearfix"> <li id="vote-up-113452216" class="up"> <a href="javascript:voting(113452216,1)" class="voting" data-article="113452216" id="up-113452216" rel="nofollow"> <i class="iconfont" data-icon-actived="&#xf0061;" data-icon-original="&#xf001f;">&#xf001f;</i> <span class="number hidden">498</span> </a> </li> <li id="vote-dn-113452216" class="down"> <a href="javascript:voting(113452216,-1)" class="voting" data-article="113452216" id="dn-113452216" rel="nofollow"> <i class="iconfont" data-icon-actived="&#xf0020;" data-icon-original="&#xf0020;">&#xf0020;</i> <span class="number hidden">-7</span> </a> </li> <li class="comments"> <a href="/article/113452216" id="c-113452216" class="qiushi_comments" target="_blank" rel="nofollow"> <i class="iconfont" data-icon-actived="&#xf0062;" data-icon-original="&#xf001d;">&#xf001d;</i> </a> </li> </ul> </div> <div class="single-share"> <!-- JiaThis Button BEGIN --> <div class="jiathis_style"> <span class="jiathis_txt">分享到:</span> <a href="###" class="jiathis_button_weixin" rel="external nofollow"></a> <a href="###" class="jiathis_button_cqq" rel="external nofollow"></a> <a href="###"class="jiathis_button_qzone" rel="external nofollow"></a> <a href="###" class="jiathis_button_tsina" rel="external nofollow"></a> <a href="###" class="jiathis_button_tieba" rel="external nofollow"></a> <a href="http://www.jiathis.com/share" class="jiathis jiathis_txt jtico jtico_jiathis" target="_blank" rel="external nofollow"></a> </div> <!-- JiaThis Button END --> </div> <div class="single-clear">
    </div> </div>

      我们可以看到,每一个段子都是<div class=”article block untagged mb15″ id=”…”>…</div>包裹的内容。

      现在我们想获取发布人,发布日期,段子内容,以及点赞的个数。不过另外注意的是,段子有些是带图片的,如果我们想在控制台显示图片是不现实的,所以我们直接把带有图片的段子给它剔除掉,只保存仅含文本的段子。

      所以写出的正则表达式如下:

    content = response.read().decode('utf-8')
    pattern = re.compile('<div.*?author">.*?<a.*?<img.*?>(.*?)</a>.*?<div.*?'+
                             'content">(.*?)<!--(.*?)-->.*?</div>(.*?)<div class="stats.*?class="number">(.*?)</i>',re.S)
    items = re.findall(pattern,content)
    for item in items:
      #item[0]是一个段子的发布者,item[1]是内容,item[2]是发布时间,item[3]是图片,item[4]是点赞数 print item[0],item[1],item[2],item[3],item[4]

      现在正则表达式在这里稍作说明

      1).*? 是一个固定的搭配,.和*代表可以匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是我们会尽可能短地做匹配,以后我们还会大量用到 .*? 的搭配。

      2)(.*?)代表一个分组,在这个正则表达式中我们匹配了五个分组,在后面的遍历item中,item[0]就代表第一个(.*?)所指代的内容,item[1]就代表第二个(.*?)所指代的内容,以此类推。

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

      这样我们就获取了发布人,发布时间,发布内容,附加图片以及点赞数。

      在这里注意一下,我们要获取的内容如果是带有图片,直接输出出来比较繁琐,所以这里我们只获取不带图片的段子就好了。所以,在这里我们就需要对带图片的段子进行过滤。我们可以发现,带有图片的段子会带有类似下面的代码,而不带图片的则没有,所以,我们的正则表达式的item[3]就是获取了下面的内容,如果不带图片,item[3]获取的内容便是空。

    <a href="/article/112061287?list=hot&amp;s=4794990" target="_blank">
    <img src="http://pic.qiushibaike.com/system/pictures/11206/112061287/medium/app112061287.jpg" alt="但他们依然乐观">
    </a>

      所以我们只需要判断item[3]中是否含有img标签就可以了。我们再把上述代码中的for循环改为下面的样子:

    for item in items:
        haveImg = re.search("img",item[3])
        if not haveImg:
           print item[0],item[1],item[2],item[4]
  • 相关阅读:
    定义一个动态的二维数组?
    学习STL map, STL set之数据结构基础
    CMM
    详细解说STL string
    仔细选择你的容器
    C++字符串类string简析
    流氓软件及反流氓软件的技术分析
    标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast
    C++资料下载
    unix系统操作命令大全
  • 原文地址:https://www.cnblogs.com/chamie/p/4905658.html
Copyright © 2020-2023  润新知