以下是要爬虫的html内容:

  1. <div class="article block untagged mb15" id='qiushi_tag_113452216'>
  2.  
  3. <div class="author">
  4. <a href="/users/30450374" target="_blank">
  5. <img src="http://pic.qiushibaike.com/system/avtnew/3045/30450374/medium/20151014094231.jpg" />
  6. 本宫不服
  7. </a>
  8. </div>
  9. <div class="content">
  10. 这是镇上一条偏僻路上的一家小饭馆,老板是一对老夫妻,开店几十年了,每次中午路过都要在这吃,满满的实惠。虽然饭店看着挺破败,但菜什么都很干净,因为挺偏的路上,人流较少,菜备的不多,有的菜都现洗。最重要的是价格,特实惠,在镇上其它饭店吃饭,鸡,鱼,价格18元,素菜8元。还不多,土豆炖肉28,只见土豆不见肉。而这家,红烧肉15一盘。全是肉,炒鸡块10元,红烧扁鱼12,素肉5元。这一大碗有肉圆,蘑菇,肉皮等的汤才7元
  11. <!--1445510496-->
  12. </div>
  13.  
  14. <div class="thumb">
  15. <a href="/article/113452216" target="_blank">
  16. <img src="http://pic.qiushibaike.com/system/pictures/11345/113452216/medium/app113452216.jpg" alt="这是镇上一条偏僻路上的一家小饭馆" />
  17. </a>
  18. </div>
  19.  
  20. <div class="stats">
  21. <span class="stats-vote"><i class="number">491</i> 好笑</span>
  22. <span class="stats-comments">
  23. <span class="dash"> · </span>
  24. <a href="/article/113452216" data-share="/article/113452216" id="c-113452216" class="qiushi_comments" target="_blank">
  25. <i class="number">97</i> 评论
  26. </a>
  27. </span>
  28. </div>
  29.  
  30. <div id="qiushi_counts_113452216" class="stats-buttons bar clearfix">
  31. <ul class="clearfix">
  32. <li id="vote-up-113452216" class="up">
  33. <a href="javascript:voting(113452216,1)" class="voting" data-article="113452216" id="up-113452216" rel="nofollow">
  34. <i class="iconfont" data-icon-actived="󰁡" data-icon-original="󰀟">󰀟</i>
  35. <span class="number hidden">498</span>
  36. </a>
  37. </li>
  38. <li id="vote-dn-113452216" class="down">
  39. <a href="javascript:voting(113452216,-1)" class="voting" data-article="113452216" id="dn-113452216" rel="nofollow">
  40. <i class="iconfont" data-icon-actived="󰀠" data-icon-original="󰀠">󰀠</i>
  41. <span class="number hidden">-7</span>
  42. </a>
  43. </li>
  44. <li class="comments">
  45. <a href="/article/113452216" id="c-113452216" class="qiushi_comments" target="_blank" rel="nofollow">
  46. <i class="iconfont" data-icon-actived="󰁢" data-icon-original="󰀝">󰀝</i>
  47. </a>
  48. </li>
  49. </ul>
  50. </div>
  51.  
  52. <div class="single-share">
  53. <!-- JiaThis Button BEGIN -->
  54. <div class="jiathis_style">
  55. <span class="jiathis_txt">分享到:</span>
  56. <a href="###" class="jiathis_button_weixin" rel="external nofollow"></a>
  57. <a href="###" class="jiathis_button_cqq" rel="external nofollow"></a>
  58. <a href="###"class="jiathis_button_qzone" rel="external nofollow"></a>
  59. <a href="###" class="jiathis_button_tsina" rel="external nofollow"></a>
  60. <a href="###" class="jiathis_button_tieba" rel="external nofollow"></a>
  61. <a href="http://www.jiathis.com/share" class="jiathis jiathis_txt jtico jtico_jiathis" target="_blank" rel="external nofollow"></a>
  62. </div>
  63. <!-- JiaThis Button END -->
  64. </div>
  65. <div class="single-clear">
    </div>
  66.  
  67. </div>

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

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

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

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

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

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

  1. for item in items:
  2. haveImg = re.search("img",item[3])
  3. if not haveImg:
  4. print item[0],item[1],item[2],item[4]

【Python爬虫实战--3】html写正则表达式的更多相关文章

  1. 【图文详解】python爬虫实战——5分钟做个图片自动下载器

    python爬虫实战——图片自动下载器 之前介绍了那么多基本知识[Python爬虫]入门知识,(没看的先去看!!)大家也估计手痒了.想要实际做个小东西来看看,毕竟: talk is cheap sho ...

  2. Python爬虫实战---抓取图书馆借阅信息

    Python爬虫实战---抓取图书馆借阅信息 原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约 ...

  3. Python爬虫实战六之抓取爱问知识人问题并保存至数据库

    大家好,本次为大家带来的是抓取爱问知识人的问题并将问题和答案保存到数据库的方法,涉及的内容包括: Urllib的用法及异常处理 Beautiful Soup的简单应用 MySQLdb的基础用法 正则表 ...

  4. Python爬虫实战五之模拟登录淘宝并获取所有订单

    经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 温馨提示 更新时间,2016-02-01,现在淘宝换成了滑块验证了 ...

  5. Python爬虫实战三之实现山东大学无线网络掉线自动重连

    综述 最近山大软件园校区QLSC_STU无线网掉线掉的厉害,连上之后平均十分钟左右掉线一次,很是让人心烦,还能不能愉快地上自习了?能忍吗?反正我是不能忍了,嗯,自己动手,丰衣足食!写个程序解决掉它! ...

  6. Python爬虫实战二之爬取百度贴吧帖子

    大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不 ...

  7. python爬虫实战——5分钟做个图片自动下载器

      python爬虫实战——图片自动下载器 制作爬虫的基本步骤 顺便通过这个小例子,可以掌握一些有关制作爬虫的基本的步骤. 一般来说,制作一个爬虫需要分以下几个步骤: 分析需求(对,需求分析非常重要, ...

  8. 转 Python爬虫实战二之爬取百度贴吧帖子

    静觅 » Python爬虫实战二之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 ...

  9. Python爬虫实战之爬取百度贴吧帖子

    大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 对百度贴吧的任意帖子进行抓取 指定是否只抓取楼主发帖 ...

  10. 《精通Python网络爬虫》|百度网盘免费下载|Python爬虫实战

    <精通Python网络爬虫>|百度网盘免费下载|Python爬虫实战 提取码:7wr5 内容简介 为什么写这本书 网络爬虫其实很早就出现了,最开始网络爬虫主要应用在各种搜索引擎中.在搜索引 ...

随机推荐

  1. 51nod1092(lcs简单运用/dp)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1092 题意:中文题诶- 思路: 解法1:最坏的情况就是在原字 ...

  2. php error _report

    [error_reporting] => Array   (   [global_value] => 32767   [local_value] => 0   [access] =& ...

  3. openwrt 添加 应用(luci-application)

    openwrt 添加应用的几个步骤如下: (1)在目录 ./feeds/luci/applications 下添加要增加的应用,譬如 "luci-test" (2)里面应该包含以下 ...

  4. git 基本的操作

      查看分支:git branch   查看所有分支:git branch -a   删除分支:git branch -d <name>   创建分支:git branch <nam ...

  5. 微信小程序 textarea 简易解决方案

    微信小程序中textarea没有bindchange事件,所以无法在输入时给变量赋值. 虽然可以使用bindblur事件,但是绑定bindblur事件,如果再点击按钮,则先执行完按钮事件后,再去执行b ...

  6. redhat 安装配置samba实现win共享linux主机目录

    [转]http://blog.chinaunix.net/uid-26642180-id-3135941.html redhat 安装配置samba实现win共享linux主机目录 2012-03-1 ...

  7. 关于PC端与手机端随着手指移动图片位置放生变化的拖拽事件

    当按下鼠标时,图片随鼠标移动松开时图片回到原位 drag("div_id") function drag(node_id){ var node = document.getElem ...

  8. .net 获取类型的Type类型的几种方法

    一:使用Object基类的GetType()方法 Car car = new Car(); Type carType = car.GetType(); 二:使用typeof操作符 Type carTy ...

  9. 1.1 Eclipse下载安装

    可直接上官网下载:http://www.eclipse.org/downloads/ 直接下载地址:http://www.eclipse.org/downloads/download.php?file ...

  10. mysql count max min 语句用法

    count 用法 求总条数 $sql="select count(*) as total from e_user"; $query = mysql_query($sql, $lin ...