• 正则表达式(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. 需求:爬取糗事百科中所有糗图照片

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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).contentimg_name = src.split('/')[-1]                            # url 最后一个斜杠的就是图片名img_path = './qiutuLibs/'+img_namewith 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).contentimg_name = src.split('/')[-1]img_path = './qiutuLibs/' + img_namewith 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. 爬取糗事百科指定页面的糗图,并将其保存到指定文件夹中

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import requests
import re
import osif __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_urlimage_name = image_url.split('/')[-1]image_path = 'images/'+image_nameimage_data = requests.get(url=image_url,headers=headers).contentwith open(image_path,'wb') as fp:fp.write(image_data)

Python爬虫 教程: re正则表达式解析html页面相关推荐

  1. Python爬虫教程-00-写在前面

    鉴于好多人想学Python爬虫,缺没有简单易学的教程,我将在CSDN和大家分享Python爬虫的学习笔记,不定期更新 基础要求 Python 基础知识 Python 的基础知识,大家可以去菜鸟教程进行 ...

  2. Python爬虫教程-26-Selenium + PhantomJS

    Python爬虫教程-26-Selenium + PhantomJS 动态前端页面 : JavaScript: JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持 ...

  3. python爬虫教程视频-python爬虫(入门教程、视频教程)

    python的版本经过了python2.x和python3.x等版本,无论哪种版本,关于python爬虫相关的知识是融会贯通的,脚本之家关于爬虫这个方便整理过很多有价值的教程,小编通过本文章给大家做一 ...

  4. Python爬虫入门教程:超级简单的Python爬虫教程

    这是一篇详细介绍 [Python]爬虫入门的教程,从实战出发,适合初学者.读者只需在阅读过程紧跟文章思路,理清相应的实现代码,30 分钟即可学会编写简单的 Python 爬虫. 这篇 Python 爬 ...

  5. Python爬虫教程(一):基础知识

    目录 01 基础知识 1.1 渲染 1.2 http(超文本传输协议)协议 1.3 requests进阶 02 数据解析 2.1 re模块 2.2 bs4模块 2.3 xpath模块 01 基础知识 ...

  6. python爬虫设计在哪里_《python 爬虫教程 知乎》 怎样用Python设计一个爬虫模拟登陆知乎...

    <python 爬虫教程 知乎> 怎样用Python设计一个爬虫模拟登陆知乎 python 爬虫教程 知乎2020-09-23 01:45:13人已围观 怎样用Python设计一个爬虫模拟 ...

  7. 菜鸟弟弟从零开始的爬取Bilibili弹幕的Python爬虫教程-哔哩哔哩 - ( ゜- ゜)つロ 干杯~

    从零开始的爬取Bilibili弹幕的Python爬虫教程 或许可以作为一个爬虫小白的练手的demo? 还是先看看什么是爬虫吧!(还有Bilibili! ) 网络爬虫: 网络爬虫(又称为网页蜘蛛,网络机 ...

  8. 在职爬虫工程师,带给大家超简单 Python 爬虫教程

    本篇 Python 爬虫教程主要讲解以下5部分内容,请按照顺序进行学习. 爬虫概述:介绍什么是爬虫,爬虫的目的和应用. 爬虫基础知识:介绍爬虫的基本概念,例如网络协议,HTML 结构,CSS 样式表等 ...

  9. python爬虫详细步骤-Python爬虫的两套解析方法和四种爬虫实现过程

    对于大多数朋友而言,爬虫绝对是学习 python 的最好的起手和入门方式.因为爬虫思维模式固定,编程模式也相对简单,一般在细节处理上积累一些经验都可以成功入门.本文想针对某一网页对 python 基础 ...

  10. python 爬虫实例 电影-Python爬虫教程-17-ajax爬取实例(豆瓣电影)

    Python爬虫教程-17-ajax爬取实例(豆瓣电影) ajax: 简单的说,就是一段js代码,通过这段代码,可以让页面发送异步的请求,或者向服务器发送一个东西,即和服务器进行交互 对于ajax: ...

最新文章

  1. 怎样定义最小 可遗传神经网络
  2. Linux下Socket的简单使用及最简化封装
  3. web架构设计经验分享(转)
  4. mysql8.1改密码,mysql 8.0以上版本修改root密码的方法
  5. combobox的值从主页面传递到子页面
  6. Pixazza把每张图片自动变成广告赚钱
  7. python框架优化方法_Python 遗传算法框架 GAFT 优化小记
  8. leecode第六十二题(不同路径)
  9. 远程连接后无法看到本地电脑分区解决方法
  10. 洪恩在线c语言测试,洪恩软件之编程之道C/C++程序设计入门视频教程
  11. 如何做出3blue1brown的动画视频
  12. 用diiv实现多个方块居中嵌套--padding
  13. 计算机网络中的猫,猫(调制解调器)和路由器有什么区别和功能?
  14. git 找回删除的文件
  15. Python文件操作-替换srt文件行文本
  16. 降本增效这九个月,爱奇艺从“穿越火线”,到“冷静增长”
  17. KVM虚拟机 装系统 命令行
  18. PyQt5_Demo5
  19. c++的内存管理(raii->shart_ptr->垃圾回收)
  20. VirtualLab基础实验教程-2.牛顿环

热门文章

  1. 获取个人借阅信息---图书馆client
  2. lua调用.so测试
  3. 【Java】在Eclipse中使用JUnit4进行单元测试(初级篇)
  4. 【linux草鞋应用编程系列】_3_ 进程间通信
  5. Bootstrap3.0学习第十轮(下拉菜单、按钮组、按钮式下拉菜单)
  6. WebPart(汇总)[转载]
  7. 《央视-走遍中国》,没机会亲自去看,了解一下也好
  8. 【备忘】外币评估数据存储表
  9. 在HANA里设置后台Job
  10. 解析BW:数据源提取数据的原理