文档章节

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

达岭凹老大
 达岭凹老大
发布于 2015/11/25 09:15
字数 1180
阅读 367
收藏 0

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

这是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模块中函数的用法,对几个常用函数的返回值,用法要熟记

© 著作权归作者所有

达岭凹老大
粉丝 60
博文 83
码字总数 69643
作品 0
南宁
程序员
私信 提问
follow大神教程——实践java爬虫之一

学习http://blog.csdn.net/pleasecallmewhy/article/details/17594303 抓取搜狗首页logo 运行结果: http://www.sogou.com/images/logo/new/sogou.png sogou审查元素中有这句<img src="http:......

realsa
2014/06/30
888
0
使用 Python 模块 re 实现解析小工具

简介: Python 模块 re(Regular Expression)是一个很有价值并且非常强大的文本解析工具,本文通过一个简单有趣的小实例来分享一下此模块的使用方法。首先讲述 Python re 的语法和功能,并通...

IBMdW
2011/04/12
968
0
(转)Python中第三方模块的使用心得

前面已经说了,其实学习Python的过程,很多时候就是在学习如何使用第三方模块,完成自己需要的功能。 关于Python的第三方库类库,其实网上很多很多相关资料。 其中,官网的Python库:Python ...

Dyllian
2013/05/22
4.5K
0
Python爬虫小实践:爬取任意CSDN博客所有文章的文字内容(或可改写为保存其他的元素),间接增加博客访问量

Python并不是我的主业,当初学Python主要是为了学爬虫,以为自己觉得能够从网上爬东西是一件非常神奇又是一件非常有用的事情,因为我们可以获取一些方面的数据或者其他的东西,反正各有用处。...

天才小熊猫QAQ
2017/10/28
49
0
Python 爬虫找到数据了 re & XPath & requests & Pool

是的,爬虫就是为了获取数据。在获取的数据中,会有很多的冗余信息,需要在获取的数据中提取所需要的有用信息。进而联想到数据的匹配:正则表达式。接下来重点介绍的是 Python 中的两个提取数...

CoderHG
2018/05/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

VMware vSphere ESXi主机的访问控制

在vShpere中,访问ESXi主机的途径很多,如下: ESXi DCUI ESXi Shell ESXi SSH ESXi Host Client vCenter --> vSphere web client / vSphere Client VMware vSphere ESXi主机的访问控制,除了......

大别阿郎
32分钟前
4
0
大神讲解CGI、FastCGI和PHP-FPM关系图解

参考资料 概念了解:CGI,FastCGI,PHP-CGI与PHP-FPM:http://www.nowamagic.net/librarys/veda/detail/1319 php中fastcgi和php-fpm是什么东西:https://www.zybuluo.com/phper/note/50231 ......

网络小虾米
41分钟前
4
0
《DNS攻击防范科普系列3》 -如何保障 DNS 操作安全

引言 前两讲我们介绍了 DNS 相关的攻击类型,以及针对 DDoS 攻击的防范措施。这些都是更底层的知识,有同学就来问能否讲讲和我们的日常操作相关的知识点,今天我们就来说说和我们日常 DNS 操...

Mr_zebra
41分钟前
4
0
zk中ServerCnxn

实现接口Stats, Watcher 内部类 DisconnectReason CloseRequestException EndOfStreamException(流关闭) 属性 方法 getSessionTimeout 获取session失效时间 sendResponse 发送回复数据 se......

writeademo
46分钟前
4
0
如何将 Redis 用于微服务通信的事件存储

来源:Redislabs 作者:Martin Forstner 翻译:Kevin (公众号:中间件小哥) 以我的经验,将某些应用拆分成更小的、松耦合的、可协同工作的独立逻辑业务服务会更易于构建和维护。这些服务(也...

中间件小哥
50分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部