python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解

时间:2021-05-22

这篇博客是自己《数据挖掘与分析》课程讲到正则表达式爬虫的相关内容,主要简单介绍Python正则表达式爬虫,同时讲述常见的正则表达式分析方法,最后通过实例爬取作者的个人博客网站。希望这篇基础文章对您有所帮助,如果文章中存在错误或不足之处,还请海涵。真的太忙了,太长时间没有写博客了,抱歉~

一.正则表达式

正则表达式(Regular Expression,简称Regex或RE)又称为正规表示法或常规表示法,常常用来检索、替换那些符合某个模式的文本,它首先设定好了一些特殊的字及字符组合,通过组合的“规则字符串”来对表达式进行过滤,从而获取或匹配我们想要的特定内容。它具有灵活、逻辑性和功能性非常的强,能迅速地通过表达式从字符串中找到所需信息的优点,但对于刚接触的人来说,比较晦涩难懂。

1.re模块

Python通过re模块提供对正则表达式的支持,使用正则表达式之前需要导入该库。

import re

import re其基本步骤是先将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得一个匹配(Match)实例,再使用Match实例获得所需信息。常用的函数是findall,原型如下:

findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags])

该函数表示搜索字符串string,以列表形式返回全部能匹配的子串。

其中参数re包括三个常见值:

(1)re.I(re.IGNORECASE):忽略大小写(括号内是完整写法)

(2)re.M(re.MULTILINE):允许多行模式

(3)re.S(re.DOTALL):支持点任意匹配模式

Pattern对象是一个编译好的正则表达式,通过Pattern提供的一系列方法可以对文本进行匹配查找。Pattern不能直接实例化,必须使用re.compile()进行构造。

2.complie方法

re正则表达式模块包括一些常用的操作函数,比如complie()函数。其原型如下:

compile(pattern[,flags] )

该函数根据包含正则表达式的字符串创建模式对象,返回一个pattern对象。参数flags是匹配模式,可以使用按位或“|”表示同时生效,也可以在正则表达式字符串中指定。Pattern对象是不能直接实例化的,只能通过compile方法得到。

简单举个实例,使用正则表达式获取字符串中的数字内容,如下所示:

>>> import re>>> string="A1.45,b5,6.45,8.82">>> regex = re.compile(r"\d+\.?\d*")>>> print regex.findall(string)['1.45', '5', '6.45', '8.82']>>>

3.match方法

match方法是从字符串的pos下标处起开始匹配pattern,如果pattern结束时已经匹配,则返回一个Match对象;如果匹配过程中pattern无法匹配,或者匹配未结束就已到达endpos,则返回None。该方法原型如下:

match(string[, pos[, endpos]]) | re.match(pattern, string[, flags])

参数string表示字符串;pos表示下标,pos和endpos的默认值分别为0和len(string);参数flags用于编译pattern时指定匹配模式。

4.search方法

search方法用于查找字符串中可以匹配成功的子串。从字符串的pos下标处起尝试匹配pattern,如果pattern结束时仍可匹配,则返回一个Match对象;若无法匹配,则将pos加1后重新尝试匹配;直到pos=endpos时仍无法匹配则返回None。 函数原型如下:

search(string[, pos[, endpos]]) | re.search(pattern, string[, flags])

参数string表示字符串;pos表示下标,pos和endpos的默认值分别为0和len(string));参数flags用于编译pattern时指定匹配模式。

5.group和groups方法

group([group1, …])方法用于获得一个或多个分组截获的字符串,当它指定多个参数时将以元组形式返回。groups([default])方法以元组形式返回全部分组截获的字符串,相当于调用group(1,2,…last)。default表示没有截获字符串的组以这个值替代,默认为None。

二.正则表达式抓取网络数据常见方法

在第三小节作者将介绍常用的正则表达式抓取网络数据的一些技巧,这些技巧都是作者自然语言处理和数据抓取实际编程中的总结,可能不是很系统,但是也能给读者提供一些抓取数据的思路以及解决实际的一些问题。

1.抓取标签间的内容

HTML语言是采用标签对的形式来编写网站的,包括起始标签和结束标签,比如<head></head>、<tr></tr>、<script><script>等。下面讲解抓取标签对之间的文本内容。

(1) 抓取title标签间的内容

首先爬取网页的标题,采用的正则表达式为'<title>(.*?)</title>',爬取百度标题代码如下:

# coding=utf-8 import re import urllib url = "http:///"content = urllib.urlopen(url).read()#爬取标题title = re.findall(r'<title>(.*?)</title>', content)print title[0]#爬取图片地址urls = re.findall(r'src="(.*?)"', content)for url in urls: print url#爬取内容start = content.find(r'<div class="essay">')end = content.find(r'<div class="essay1">')page = content[start:end] res = r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')"t1 = re.findall(res, page) #超链接print t1[0]t2 = re.findall(r'<a .*?>(.*?)</a>', page) #标题print t2[0]t3 = re.findall('<p style=.*?>(.*?)</p>', page, re.M|re.S) #摘要(print t3[0]print ''start = content.find(r'<div class="essay1">')end = content.find(r'<div class="essay2">')page = content[start:end] res = r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')"t1 = re.findall(res, page) #超链接print t1[0]t2 = re.findall(r'<a .*?>(.*?)</a>', page) #标题print t2[0]t3 = re.findall('<p style=.*?>(.*?)</p>', page, re.M|re.S) #摘要(print t3[0]

输出结果如图所示。

通过上面的代码,读者会发现使用正则表达式爬取网站还是比较繁琐,尤其是定位网页节点时,后面将讲述Python提供的常用第三方扩展包,利用这些包的函数进行定向爬取。

希望这篇文字对你有所帮助,尤其是刚接触爬虫的同学或是遇到类似问题的同学,更推荐大家使用BeautifulSoup、Selenium、Scrapy等库来爬取数据。

以上这篇python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章