"使用正则表达式从源码中获取想要的内容"
html
这是python爬虫的第二个重要内容,第一个是怎么分析网页源码,包括使用各类工具分析网页源码python
首先仍是肯定咱们要从网页中获取什么内容,但愿你们尚未忘记正则表达式
"发布人,发布内容,点赞数,评论数"python爬虫
为了能更容易的上手,我这里先跟你们说两个经常使用的匹配公式,毕竟在不少不少的匹配中,用这两个公式已经可以知足咱们的需求函数
1. .*? 是一个固定的搭配,.和*表明能够匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是咱们会尽量短地作匹配,之后咱们还会大量用到 .*? 的搭配工具
2. (.*?)加了一个括号表示将匹配到的内容返回,一个(.*?)表明一个分组,就是一个返回来的值,若是在这个正则表达式中咱们匹配了4个分组,在后面的遍历item中,item[0]就表明第一个(.*?)所指代的内容,item[1]就表明第二个(.*?)所指代的内容,以此类推spa
好了,好好记住这两个公式表明的含义,而后咱们开始正则表达式匹配吧code
为了简单起见,这里使用获取发布人信息做为例子,由于贴上太多的网页源码很容易会乱htm
首先对例子中出现的发布人信息感到抱歉,本无心冒犯get
--------------------带有发布人信息的网页源码--------------------------- <div class="author clearfix"> <a href="/users/29037698" target="_blank" rel="nofollow"> <img src="http://pic.qiushibaike.com/system/avtnew/2903/29037698/me dium/20150715144646.jpg" alt="炒菜X炒股"/> </a> <a href="/users/29037698" target="_blank" title="炒菜X炒股"> <h2>炒菜X炒股</h2> </a> </div> ----------------------------------end------------------------------
好,咱们能够看到这里的发布人"炒菜X炒股"一共出现了三次,实际上,这三次咱们均可以做为发布人信息来获取,这意味着有三个正则表达式
<div.*?class="auther.*?<img.*?alt="(.*?)"/>
这是获取第一个发布人信息的正则表达式
1. <div.*?class="auther.*?<img 从<div class="author开始匹配,匹配<div 到<img的内容
2. <img.*?alt=" 匹配<img 到alt=" 之间的内容
3. alt="(.*?)"/> 匹配alt=" 到 "/> 的内容,(.*?) 加了一个括号表示将匹配到的内容返回
4. .*? 最后一个表示匹配剩下的全部内容
<div.*?class="auther.*?<a.*?</a>.*?<a.*?title="(.*?)">.*?
这是获取第二个发布人信息的正则表达式
1. <div.*?class="auther.*?<a 从<div class="author开始匹配,匹配<div 到第一个<a的内容
2. <a.*?</a>.*?<a 为何要有两个 <a ,咱们再来看代码的相应的部分
<div class="author clearfix"> ---->第一个<a----> <a href="/users/29037698" target="_blank" rel="nofollow"> <img src="http://pic.qiushibaike.com/system/avtnew/2903/29037698/medium/20150715144646.jpg" alt="炒菜不炒股"/> </a> ---->第二个<a----> <a href="/users/29037698" target="_blank" title="炒菜不炒股">
代码中有两个<a></a>,而咱们要的数据在第二个中,因此,咱们要使用RE将第一个表示出来,再表示第二个,否则程序不知道是哪一个<a>
<h2>(.*?)</h2>.*?
这是最简单的也是我最喜欢的写法,经过对整个网页源码的分析咱们知道,全部发布人的名字都包含在<h2></h2>这个代码块中,它具备很强特殊性和规律性,因此咱们能够直接匹配这个字符
关于RE,我想说的
由于在编写RE的过程当中,我常常遇到程序运行不报错就是没有结果或者是死循环的状况,因此这里说几句备忘
1. RE很难写,它的难写之处在于它不是惟一的,你能够有好多种写法来实现你的功能,要写对一个RE,推荐两种方式
1. 傻瓜式的一级一级数据的匹配,从最开始的一层到最后面的目标层一级一级的匹配
就像上面的第二种方法
2. 认真分析源码,找出最具表明性的地方,这能使你的RE更加简单和有效
就像第三种方法
2. RE很繁琐,尤为是面对不少的数据的时候,这时候要一步一步慢慢写,直到最终实现目标,或者是单独抽取一部份内容出来先实现匹配,再应用到全部数据中
3. 好好体会python re模块中函数的用法,对几个经常使用函数的返回值,用法要熟记