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

"使用正则表达式从源码中获取想要的内容"

这是python爬虫的第二个重要内容,第一个是怎么分析网页源码,包括使用各种工具分析网页源码

首先还是确定我们要从网页中获取什么内容,希望大家还没有忘记

"发布人,发布内容,点赞数,评论数"

为了能更容易的上手,我这里先跟大家说两个常用的匹配公式,毕竟在很多很多的匹配中,用这两个公式已经能够满足我们的需求

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

        2. (.*?)加了一个括号表示将匹配到的内容返回,一个(.*?)代表一个分组,就是一个返回来的值,如果在这个正则表达式中我们匹配了4个分组,在后面的遍历item中,item[0]就代表第一个(.*?)所指代的内容,item[1]就代表第二个(.*?)所指代的内容,以此类推

好了,好好记住这两个公式代表的含义,然后我们开始正则表达式匹配吧

为了简单起见,这里使用获取发布人信息作为例子,因为贴上太多的网页源码很容易会乱

首先对例子中出现的发布人信息感到抱歉,本无意冒犯

--------------------带有发布人信息的网页源码---------------------------
<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模块中函数的用法,对几个常用函数的返回值,用法要熟记

转载于:https://my.oschina.net/u/2429887/blog/535193

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值