python 3爬虫学习笔记(3) —— 正则表达式

一. 正则表达式的定义

正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。

二.正则表达式的规则:

符号含义
*匹配前面的字符,子表达式或者括号里的字符0次或者多次
+匹配前面的字符,子表达式或者括号里的字符至少一次
[]匹配任意一个字符(任选一个)
()表达式编组(优先运行)
{m,n}匹配前面的字符,子表达式或者括号里的字符m到n次(包括m和n)
[^]匹配任意一个不在中括号里的字符
|匹配任意一个由竖线分割的字符,子表达式
.匹配任意单个字符(包括符号,数字,空格等)
^指字符串开始位置的字符或者子表达式
\转义字符
$经常用在正则表达式的末尾,表示“从字符串的末端匹配”。如果不用它,每个正则表达式实际都带着".*“模式,只会从字符串开头进行匹配。这个符号可以看作”^"的反义词
?!“不包含”,通常放在字符或者正则表达式前面,表示字符不能出现在目标字符串里。

三.正则表达式的应用

正则表达式在实际中的一个经典应用是识别邮箱地址。虽然不同邮箱服务器的邮箱地址规则不尽相同,但是还是可以创建几条通用规则。

规则正则表达式
1.邮箱地址的第一部分至少包括一种内容:大写字母,小写字母,数字0~9,点(.),加号(+)或者下划线(_)[A-Za-z0-9._+]+ :把所有可能的序列和符号放在中括号里,表示“括号中的符号里的任意一个”。后面的加号表示“至少出现一次”
2.之后,邮箱地址会包含一个@符号@
3.在@之后,必须至少包含一个大写或者小写字母[A-Za-z]+
4.之后跟一个点号(.)\.:域名前必须有一个点
5.最后邮箱地址用com,org,edu,net结尾(com|org|edu|net)

把上面的规则连接起来,就获得了完整的正则表达式:
[A-Za-z0-9\._+]+@[A-Za-z]+.(com|org|edu|net)

四.正则表达式和BeautifulSoup

在抓取网页的时候,BeautifulSoup和正则表达式总是配合使用的。其实,大多数支持字符串参数的函数都可以用正则表达式实现。

来看一个例子:
待抓取的网页是 http://www.pythonscraping.com/pages/page3.html
下面是这个页面的截图:

在这里插入图片描述

页面上有几个商品的图片——他们的源码形式如下:
在这里插入图片描述

如果我们想要抓取所有图片的URL链接,非常直接的做法就是用findAll(“img”)抓取所有图片。
但是这样做有一个问题,新式的网站里都有一些隐藏的图片,用于网页布局留白和元素对齐的空白图片,以及一些不容易察觉到的图片标签。总之,不能仅仅用商品图片来统计网页上的所有图片。
而且网页的布局也可能会变化,或者,由于某些原因,我们不想通过图片在网页中的位置来查找标签。那么当你想抓取随机分布在网站里的某个元素或者数据时,就会出现问题。

解决这些问题的办法,就是直接定位那些标签来查找信息:

from urllib.request import urlopen
from bs4 import BeautifulSoup
import re

html = urlopen("http://www.pythonscraping.com/pages/page3.html")
bsObj = BeautifulSoup(html)
images = bsObj.findAll("img",{"src":re.compile("\.\.\/img\/gifts\/img.*\.jpg")})
for image in images:
    print(image["src"])

这段代码会打印出图片的相对路径:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值