【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
"使用正则表达式从源码中获取想要的内容"
这是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模块中函数的用法,对几个常用函数的返回值,用法要熟记
来源:oschina
链接:https://my.oschina.net/u/2429887/blog/535193