• 正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。

  • 正则表达式通常被用来匹配、检索、替换和分割那些符合某个模式(规则)的文本。

一、常用正则表达式回顾

   单字符:
. : 除换行以外所有字符
[] :[aoe] [a-w] 匹配集合中任意一个字符
\d :数字 [0-9]
\D : 非数字
\w :数字、字母、下划线、中文
\W : 非\w
\s :所有的空白字符包,括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S : 非空白 数量修饰:
* : 任意多次 >=0
+ : 至少1次 >=1
? : 可有可无 0次或者1次
{m} :固定m次 hello{3,}
{m,} :至少m次
{m,n} :m-n次 边界:
$ : 以某某结尾
^ : 以某某开头 分组
(ab)
贪婪模式: .*
非贪婪(惰性)模式
: .*? re.I : 忽略大小写
re.M :多行匹配
re.S :单行匹配 re.sub(正则表达式, 替换内容, 字符串)

回顾练习:

import re

#提取出python
key="javapythonc++php"
re.findall('python',key)[0] # 都有引号 #提取出hello world
key="<html><h1>hello world<h1></html>"
re.findall('<h1>(.*)<h1>',key)[0] #提取170
string = '我喜欢身高为170的女孩'
re.findall('\d+',string) #提取出http://和https://
key='http://www.baidu.com and https://boob.com'
re.findall('https?://',key) #提取出hello
key='lalala<hTml>hello</HtMl>hahah' #输出<hTml>hello</HtMl>
re.findall('<[Hh][Tt][mM][lL]>(.*)</[Hh][Tt][mM][lL]>',key) #提取出hit.
key='bobo@hit.edu.com' #想要匹配到hit.
re.findall('h.*?\.',key) #匹配sas和saas
key='saas and sas and saaas'
re.findall('sa{1,2}s',key) #匹配出i开头的行
string = '''fall in love with you
i love you very much
i love she
i love her''' re.findall('^i.*',string,re.M) #匹配全部行
string1 = """<div>静夜思
窗前明月光
疑是地上霜
举头望明月
低头思故乡
</div>""" re.findall('.*',string1,re.S)

注意:re.findall()通常匹配出来的是列表,所以要通过索引的方式将内容提取出来。

二、数据解析-正则表达式

1. 需求:爬取糗事百科中所有糗图照片

import requests
import re
import os #创建一个文件夹
if not os.path.exists('./qiutuLibs'): # 注意里面要有引号
os.mkdir('./qiutuLibs') headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
} url = 'https://www.qiushibaike.com/pic/'
page_text = requests.get(url=url,headers=headers).text #进行数据解析(图片的地址)
ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>' #不相关的可以用.*,非贪婪匹配 #re.S单行匹配
src_list = re.findall(ex,page_text,re.S)
print(src_list) for src in src_list:
src = 'https:'+src #发现src属性值不是一个完整的url,缺少了协议头 #对图片的url单独发起请求,获取图片数据.content返回的是二进制类型的响应数据
img_data = requests.get(url=src,headers=headers).content
img_name = src.split('/')[-1] # url 最后一个斜杠的就是图片名
img_path = './qiutuLibs/'+img_name
with open(img_path,'wb') as fp:
fp.write(img_data)
print(img_name,'下载成功!')

2. 糗图分页爬取

import requests
import re
import os # 创建一个文件夹
if not os.path.exists('./qiutuLibs'):
os.mkdir('./qiutuLibs') headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
} #封装一个通用的url模板
url = 'https://www.qiushibaike.com/pic/page/%d/?s=5185803' for page in range(1,36):
new_url = format(url%page) #不要忘了format,里面不加引号
page_text = requests.get(url=new_url, headers=headers).text # 进行数据解析(图片的地址)
ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
src_list = re.findall(ex, page_text, re.S) # re.S单行匹配,因为页面源码里面有 \n # 发现src属性值不是一个完整的url,缺少了协议头
for src in src_list:
src = 'https:' + src
# 对图片的url单独发起请求,获取图片数据.content返回的是二进制类型的响应数据
img_data = requests.get(url=src, headers=headers).content
img_name = src.split('/')[-1]
img_path = './qiutuLibs/' + img_name
with open(img_path, 'wb') as fp:
fp.write(img_data)
print(img_name, '下载成功!')

观察各个页面之间的关联

输入1,结果自动跳转到首页

 注意:url使用format的编写格式

#封装一个通用的url模板
url = 'https://www.qiushibaike.com/pic/page/%d/?s=5185803' for page in range(1,36):
new_url = format(url%page) #不要忘了format,里面不加引号

3. 爬取糗事百科指定页面的糗图,并将其保存到指定文件夹中

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
import re
import os if __name__ == "__main__":
url = 'https://www.qiushibaike.com/pic/%s/'
headers={
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
} #指定起始也结束页码
page_start = int(input('enter start page:'))
page_end = int(input('enter end page:')) #创建文件夹
if not os.path.exists('images'):
os.mkdir('images') #循环解析且下载指定页码中的图片数据
for page in range(page_start,page_end+1):
print('正在下载第%d页图片'%page)
new_url = format(url % page)
response = requests.get(url=new_url,headers=headers) #解析response中的图片链接
e = '<div class="thumb">.*?<img src="(.*?)".*?>.*?</div>'
pa = re.compile(e,re.S)
image_urls = pa.findall(response.text) #循环下载该页码下所有的图片数据
for image_url in image_urls:
image_url = 'https:' + image_url
image_name = image_url.split('/')[-1]
image_path = 'images/'+image_name

image_data = requests.get(url=image_url,headers=headers).content
with open(image_path,'wb') as fp:
fp.write(image_data)

Python爬虫 | re正则表达式解析html页面的更多相关文章

  1. 玩转python爬虫之正则表达式

    玩转python爬虫之正则表达式 这篇文章主要介绍了python爬虫的正则表达式,正则表达式在Python爬虫是必不可少的神兵利器,本文整理了Python中的正则表达式的相关内容,感兴趣的小伙伴们可以 ...

  2. 【python爬虫和正则表达式】爬取表格中的的二级链接

    开始进公司实习的一个任务是整理一个网页页面上二级链接的内容整理到EXCEL中,这项工作把我头都搞大了,整理了好几天,实习生就是端茶送水的.前段时间学了爬虫,于是我想能不能用python写一个爬虫一个个 ...

  3. 【Python爬虫】正则表达式与re模块

    正则表达式与re模块 阅读目录 在线正则表达式测试 常见匹配模式 re.match re.search re.findall re.compile 实战练习 在线正则表达式测试 http://tool ...

  4. python 爬虫之-- 正则表达式

    正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. 正则表达式非python独有,python 提供了正则表达式的接口,re模块 一.正则匹配字符简介 模式 描述 \d ...

  5. python爬虫使用xpath解析页面和提取数据

    XPath解析页面和提取数据 一.简介 关注公众号"轻松学编程"了解更多. XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言.X ...

  6. Python爬虫10-页面解析数据提取思路方法与简单正则应用

    GitHub代码练习地址:正则1:https://github.com/Neo-ML/PythonPractice/blob/master/SpiderPrac15_RE1.py 正则2:match. ...

  7. Python爬虫——使用 lxml 解析器爬取汽车之家二手车信息

    本次爬虫的目标是汽车之家的二手车销售信息,范围是全国,不过很可惜,汽车之家只显示100页信息,每页48条,也就是说最多只能够爬取4800条信息. 由于这次爬虫的主要目的是使用lxml解析器,所以在信息 ...

  8. python之urllib2简单解析HTML页面之篇一

    一.urllib2简单获取html页面 #!/usr/bin/env python # -*- coding:utf-8 -*- import urllib2 response = urllib2.u ...

  9. python爬虫之html解析Beautifulsoup和Xpath

    Beautiifulsoup Beautiful Soup 是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据.BeautifulSoup 用来解析 HTML 比较简 ...

随机推荐

  1. 全栈项目|小书架|服务器端-NodeJS+Koa2实现首页图书列表接口

    通过上篇文章 全栈项目|小书架|微信小程序-首页水平轮播实现 我们实现了前端(小程序)效果图的展示,这篇文章来介绍服务器端的实现. 首页书籍信息 先来回顾一下首页书籍都有哪些信息: 从下面的图片可以看 ...

  2. Resharper2019 1.2破解教程

    下载安装 Resharper 去Resharper官网下载安装 Resharper官网地址 Resharper下载地址 破解 (破解dll百度网盘链接)[https://pan.baidu.com/s ...

  3. 2019 网易java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.网易等公司offer,岗位是Java后端开发,因为发展原因最终选择去了网易,入职一年时间了,也成为了面试官,之 ...

  4. python预习day1

    计算机基础 cpu 大脑 内存 临时记忆 硬盘 永久记忆 输入设备 眼睛 耳朵 输出设备 嘴巴 操作系统 控制计算机硬件工作流程的 应用程序 安装在操作系统之上的软件 python简介 python是 ...

  5. DNS原理及劫持问题

    对于互联网,人们总是高谈阔论,却很少有人愿意去了解电脑.手机.电视这些设备到底是如何被“连接”起来的.本文通过“我”,一个普通的网络请求的视角,给大家介绍下“我”的工作流程是如何的. 人们动动手指,点 ...

  6. jQuery设置样式css

    一.设置单个样式 $('.div').css('padding-top','8.6rem'); 二.设置多个样式 $('.div').css({'width': "240px",' ...

  7. JavaScript: 详解正则表达式之三

    在上两篇文章中博主介绍了JavaScript中的正则常用方法和正则修饰符,今天准备聊一聊元字符和高级匹配的相关内容. 首先说说元字符,想必大家也都比较熟悉了,JS中的元字符有以下几种: / \ | . ...

  8. JavaScript: 详解正则表达式之一

    正则表达式是一个精巧的利器,经常用来在字符串中查找和替换,JavaScript语言参照Perl,也提供了正则表达式相关模块,开发当中非常实用,在一些类库或是框架中,比如jQuery,就存在大量的正则表 ...

  9. 浅谈HDFS(三)之DataNote

    DataNode工作机制 一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳. DataNode启动后向Nam ...

  10. 产生大于N的Smith数

    实验三  求Smith数 实验目的: 通过本次实验,掌握穷举算法的基本思想. 实验环境: 硬件:PC机 软件:windows操作系统,C语言 实验内容: 若一个合数的质因数分解式逐位相加之和等于其本身 ...