python-19:使用正则表达式从源码中获取想要的内容

"使用正则表达式从源码中获取想要的内容"
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模块中函数的用法,对几个经常使用函数的返回值,用法要熟记

相关文章
相关标签/搜索