Python爬虫之正则表达式于xpath的使用教学及案例
正则表达式
常用的匹配模式
\d # 匹配任意一个数字
\D # 匹配任意一个非数字
\w # 匹配任意一个单词字符(数字、字母、下划线)
\W # 匹配任意一个非单词字符
. # 匹配任意一个字符(除了换行符)
[a-z] # 匹配任意一个小写字母
[\u4e00-\u9fa5] # 匹配任意一个汉字
^ # 匹配字符串的开始
$ # 匹配字符串的结束
? # 匹配0次或1次
+ # 匹配1次或多次
* # 匹配任意次
{n} # 匹配n次
{n,} # 至少匹配n次
{n, m} # 至少匹配n次, 最多匹配m次
a|b # 匹配a或者b
() # 匹配括号内的表达式
正则表达式的基础演示
# 1.匹配符合指定个数的字符串
# 导入正则表达式的库
import re
tel = '123456'
tel1 = '1234567'
result = re.match("^\d{6}$",tel)
result1 = re.match("\d{6}$",tel1)
result3 = re.match("\d{6}", tel)
print(result) # 返回结果:<re.Match object; span=(0, 6), match='123456'>
print(result1) # 返回结果:None
print(result3) # 返回结果:<re.Match object; span=(0, 6), match='123456'>
# 1.匹配汉字
name = '啦啦1啦'
name2 = '2哈哈哈'
# match是从开头开始搜索,开头有汉字就有,没汉字就没有
result = re.match("[\u4e00-\u9fa5]{2,4}", name)
result1 = re.match("[\u4e00-\u9fa5]{2,4}", name2) # 从开头开始搜索
# search是全局搜索
result2 = re.search("[\u4e00-\u9fa5]{2,4}", name2)
result3 = re.search("[\u4e00-\u9fa5]{2,4}", name)
print(result)
print(result1)
print(result2)
print(result3)
# 返回的结果依次是:
# <re.Match object; span=(0, 2), match='啦啦'>
# None
# <re.Match object; span=(1, 4), match='哈哈哈'>
# <re.Match object; span=(0, 2), match='啦啦'>
# 3. search 只匹配一次,findall 对整个字符串进行检索
keys = 'good good study 2012 , day day up 2022'
result = re.search('good', keys)
print('匹配1条:', result)
# 返回的结果: 匹配1条: <re.Match object; span=(0, 4), match='good'>
result2 = re.findall('good', keys)
print('匹配多条并以列表的格式返回:', result2)
# 返回的结果: 匹配多条并以列表的格式返回: ['good', 'good']
正则表达式与爬虫结合小案例,爬取豆瓣top250的图片
import re
import requests
import os
# 网页URL爬取
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36'}
response = requests.get('https://movie.douban.com/top250',headers=headers)
print(response.text)# <img width="100" alt="寻梦环游记" src="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2505426431.jpg" class="">
title = 'width="100" alt="(.*?)" '
zp = 'src="(.*?)" class=""'
select = 'width="100" alt="(.*?)" src="(.*?)" class=""'
name = re.findall(title, response.text)
zpUrl = re.findall(zp, response.text)
ok = re.findall(select, response.text)
print(name)
print(zpUrl)
print(ok)# 创建保存图片的目录
save_dir = 'downloaded_images'
if not os.path.exists(save_dir):os.makedirs(save_dir)
for i, ii in enumerate(ok):# print(i)print(f'电影{ii[0]}的海报下载地址:{ii[1]}')# 下载图片内容img_data = requests.get(ii[1]).content# 构建保存路径file_path = os.path.join(save_dir, f'{i+1}.{ii[0]}.jpg')# 保存图片with open(file_path, 'wb') as file:file.write(img_data)print(f'Image {i+1} saved to {file_path}')
else:print('Failed to retrieve the webpage')
正则表达式中的 .*?
和 .*
的区别
在正则表达式中,.*?
和 .*
都用于匹配任意数量的字符,但它们的匹配方式有所不同。
1. .*的理解
- 定义:
.*
匹配任意数量的字符(包括零个字符),并且是 贪婪(greedy)的。 - 贪婪模式:贪婪模式会尽可能多地匹配字符。例如,在字符串
abc123def
中,正则表达式a.*d
将匹配整个字符串,因为.*
会尽可能地匹配到最后的d
。 - 示例:
- 输入:
abc123def
- 正则:
a.*d
- 匹配结果:
abc123def
- 输入:
2. .*?的理解
- 定义:
.*?
同样匹配任意数量的字符(包括零个字符),但它是 非贪婪(lazy)的。 - 非贪婪模式:非贪婪模式会尽可能少地匹配字符,优先匹配最短的字符串。例如,在同样的字符串
abc123def
中,正则表达式a.*?d
只会匹配ab
和d
之间的字符,结果是abc123def
中的a
和第一个d
之间的最短部分。 - 示例:
- 输入:
abc123def
- 正则:
a.*?d
- 匹配结果:
abc123d
- 输入:
总结
.*
是贪婪的,会尽量多地匹配字符,直到最后一个符合条件的字符。.*?
是非贪婪的,会尽量少地匹配字符,优先返回最短的符合条件的字符串。
将爬取的图片以wb保存二进制文件
正则表达式获取豆瓣电影评分和参评人数
解析网页另一好用方法xpath
通过提问逐步理解
1.提问1:xm1和htm1分别代表什么意思?有什么区别
- xml:可扩展的标记语言,html:超文本标记语句
- 相同点:成双成对,又开始有结束。
- 区别:xml的标签可以自定义,语法更自由
2.提问2:xpath的作用
- xpath使用路径表达式在xml或html文档中查找目标信息
3.提问3:如果想使用xpath,必须安装哪个库(其中使用了清华镜像)
pip install lxml -i https://pypi.tuna.tsinqhua.edu.cn/simple
4.问题四: 如何构建etree树(使用的网页网址为https://movie.douban.com/top250)
任务4的案例源发如下:
import requests
from lxml import etree# 通过读取本地下载好的网页文件再对网页内容进行解析提取
file = open('demo1.html', 'r', encoding='utf-8')
# 读取目前网页内容
content = file.read()# 构建etree树后,才可以使用xpath表达式
html = etree.HTML(content)# 使用XPath提取图片的src属性
image_urls = html.xpath('//a/img/@src')# 获取电影名称
title = html.xpath('//span[@class="title"][1]/text()')
print(title)
# 下载图片
for i, url in enumerate(image_urls):# 设置图片保存路径file_path = f"图片/{i}{title[i]}.webp"# 下载图片response = requests.get(url)if response.status_code == 200:with open(file_path, 'wb') as f:f.write(response.content)print(f"图片已下载到: {file_path}")else:print(f"图片下载失败: {url}")
效果如下:
相关文章:

Python爬虫之正则表达式于xpath的使用教学及案例
正则表达式 常用的匹配模式 \d # 匹配任意一个数字 \D # 匹配任意一个非数字 \w # 匹配任意一个单词字符(数字、字母、下划线) \W # 匹配任意一个非单词字符 . # 匹配任意一个字符(除了换行符) [a-z] # 匹配任意一个小写字母 […...

Jenkins打包,发布,部署
一、概念 Jenkins是一个开源的持续集成工具,主要用于自动构建和测试软件项目,以及监控外部任务的运行。与版本管理工具(如SVN,GIT)和构建工具(如Maven,Ant,Gradle)结合使…...

CSS 实现楼梯与小球动画
CSS 实现楼梯与小球动画 效果展示 CSS 知识点 CSS动画使用transform属性使用 页面整体布局 <div class"window"><div class"stair"><span style"--i: 1"></span><span style"--i: 2"></span>…...

sqli-labs less-14post报错注入updatexml
post提交报错注入 闭合方式及注入点 利用hackbar进行注入,构造post语句 unameaaa"passwdbbb&SubmitSubmit 页面报错,根据分析,闭合方式". 确定列数 构造 unameaaa" or 11 # &passwdbbb&SubmitSubmit 确定存在注…...

Python开发环境配置(mac M2)
1. 前言 作为一名程序员,工作中需要使用Python进行编程,甚至因为项目需要还得是不同版本的Python如何手动管理多个版本的Python,如何给Pycharm(IDE)配置对应的interpreter等,都成为一个 “不熟练工” 的难…...

其他:Python语言绘图合集
文章目录 介绍注意导入数据函数模块画图 介绍 python语言的科研绘图合集 注意 This dataset includes the following (All files are preceded by "Marle_et_al_Nature_AirborneFraction_"):- "Datasheet.xlsx": Excel dataset containing all annual a…...

处理 Vue3 中隐藏元素刷新闪烁问题
一、问题说明 页面刷新,原本隐藏的元素会一闪而过。 效果展示: 页面的导航栏通过路由跳转中携带的 meta 参数控制导航栏的 显示/隐藏,但在实践过程中发现,虽然元素隐藏了,但是刷新页面会出现闪烁的问题。 项目源码&…...

【MySQL】数据目录迁移
一、使用场景 使用该方法一般是数据目录所在磁盘不支持扩展,只能通过新加磁盘来扩展数据目录磁盘空间。通常是Windows服务器,或者是Linux服务器的mysql数据目录的磁盘没有使用lvm。 二、准备工作 1. 新磁盘初始化,达到可使用状态 2. 需要自己…...

【项目安全设计】软件系统安全设计规范和标准(doc原件)
1.1安全建设原则 1.2 安全管理体系 1.3 安全管理规范 1.4 数据安全保障措施 1.4.1 数据库安全保障 1.4.2 操作系统安全保障 1.4.3 病毒防治 1.5安全保障措施 1.5.1实名认证保障 1.5.2 接口安全保障 1.5.3 加密传输保障 1.5.4终端安全保障 资料获取:私信或者进主页。…...

INS淡绿色风格人像街拍Lr调色教程,手机滤镜PS+Lightroom预设下载!
调色介绍 INS 淡绿色风格人像街拍通过 Lightroom 调色可以营造出清新、自然、时尚的视觉效果。这种风格以淡绿色为主色调,给人一种宁静、舒适的感觉。 预设信息 调色风格:INS风格预设适合类型:人像,街拍,自拍&#…...

python 实现最小路径和算法
最小路径和算法介绍 最小路径和问题通常指的是在一个网格(如二维数组)中,找到从起点(如左上角)到终点(如右下角)的一条路径,使得路径上经过的元素值之和最小。这类问题可以通过多种…...

Vue3实现动态菜单功能
文章目录 0.效果演示1.搭建Vue3项目1.1 vite 脚手架创建 Vue3 项目1.2 设置文件别名1.3 安装配置 element-plus1.4 安装配置路由2.登录页面3.后台管理页面3.1 搭建后台框架3.2 左侧菜单栏3.3 header 用户信息3.4 主要内容3.5 footer4.配置静态路由5.记录激活菜单5.1 el-menu 绑…...

Qt+VS2019+大恒相机相机回调方式总结
一、前言 大恒驱动安装完成后,在安装目录有SDK调用文档,里面有更详细的调用介绍,此文档对近期做的Demo做一个回顾性总结。 二、调用流程概述 三、针对性内容介绍: 1. 在执行相机操作之前,需要先执行此代码࿱…...

Python库pandas之六
Python库pandas之六 输入/输出read_sql函数应用实列 输入/输出 read_sql 函数 词法:pandas.read_sql(sql, con, index_colNone, coerce_floatTrue, paramsNone, parse_datesNone, columnsNone, chunksizeNone, dtype_backend<no_default>, dtypeNone) rea…...

[C++]使用纯opencv部署yolov11-seg实例分割onnx模型
【算法介绍】 在C中使用纯OpenCV部署YOLOv11-seg进行实例分割是一项具有挑战性的任务,因为YOLOv11通常是用PyTorch等深度学习框架实现的,而OpenCV本身并不直接支持加载和运行PyTorch模型。然而,可以通过一些间接的方法来实现这一目标&#x…...

PAT甲级-1122 Hamiltonian Cycle
题目 题目大意 给定一个图和几组顶点,判断每组顶点是否能构成一个哈密顿回路。 知识点 哈密顿回路满足几点要求:构成一个封闭环,并且经过所有顶点,每个顶点经过一次。 即满足第一个顶点值和最后一个顶点值相等;只有…...

Java 插入排序
插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。以下是插入排序的Java实现: public class Inserti…...

随机掉落的项目足迹:Vue3中vite.config.ts配置代理服务器解决跨域问题
跨域问题产生的原因:浏览器同源策略 后面的通俗解释小标题下的内容是便于大家理解同源策略和跨域问题。 而同源策略和跨域问题这两个小标题下的内容虽然比较专业不容易阅读,但是还是建议大家花时间理解并记忆,因为这是前端面试中的常考点。…...

C++笔记之标准库和boost库中bind占位符_1的写法差异
C++笔记之标准库和boost库中bind占位符_1的写法差异 code review! 参考博文: C++新特性探究(十五):bind 在C++中,_1 和 std::placeholders::_1 都用于表示占位符,但它们有不同的上下文:...

二分查找
文章目录 1.算法思想2.代码实现(1)循环实现(2)递归实现 3.题目练习 1.算法思想 二分查找(折半查找):有序数组(升序或降序,可以不连续),每次缩小一半的区间。 时间复杂度:O(log n) 空间复杂度:循环实现是 O(1)…...

关注、取关、Redis实现共同关注、 博客推送与分页查询
Resourceprivate StringRedisTemplate stringRedisTemplate;Resourceprivate IUserService userService;Overridepublic Result follow(Long followUserId, Boolean isFollow) {//1.获取登陆的用户Long userId UserHolder.getUser().getId();//1.判断是关注还是取关if(isFollo…...

专业高清录屏软件!Mirillis Action v4.40 解锁版下载,小白看了都会的安装方法
Mirillis Action!(暗神屏幕录制软件)专业高清屏幕录像软件,被誉为游戏视频三大神器之一。这款屏幕录制软件和游戏录制软件,拥有三大硬件加速技术,支持以超高清视频画质录制桌面和实况直播,超清视频画质&…...

胤娲科技:AI重塑会议——灵动未来,会议新纪元
你是否曾经历过这样的会议场景:会议纪要不准确,人名张冠李戴;错过会议,却无从回顾关键内容;会议效率低下,时间白白流逝? 这些问题仿佛成了现代会议的“顽疾”。然而,随着AI技术的飞速…...

Python画笔案例-080 绘制 颜色亮度测试
1、绘制 颜色亮度测试 通过 python 的turtle 库绘制 颜色亮度测试,如下图: 2、实现代码 绘制 颜色亮度测试,以下为实现代码: """颜色亮度测试.py本程序需要coloradd模块支持,请在cmd窗口,即命令提示符下输入pip install coloradd进行安装。本程序演示brig…...

MATLAB工具库:数据统计分析工具MvCAT、MhAST等
MATLAB工具库:数据统计分析工具MvCAT、MhAST等 工具1:Multivariate Copula Analysis Toolbox (MvCAT)MATLAB中运行 工具2:Multi-hazard Scenario Analysis Toolbox (MhAST) 参考 The University of California-软件库-Software 工具1…...

角色动画——RootMotion全解
1. Unity(2022)的应用 由Animtor组件控制 在Animation Clip下可进行详细设置 官方文档的介绍(Animation选项卡 - Unity 手册) 上述动画类型在Rag选项卡中设置: Rig 选项卡上的设置定义了 Unity 如何将变形体映射到导入模型中的网格,以便能够将其动画化。 对于人…...

加密软件的桌面管理系统有什么?
1、IT资源管控:协助企事业单位管理者对内部计算机、宽带、打印、外围设备等IT资源进行管控,提高IT资源利用率。 2、规范内网行为:规范员工的计算机使用行为、网络使用行为、IT资产使用行为、设备使用行为 等,令员工活动在合规范围…...

【stm32】寄存器(stm32技术手册下载链接)
1、资料下载 RM0008_STM32F101xx,STM32F102xx,STM32F103xx,STM32F105xx和STM32F107xx单片机参考手册 | STMCU中文官网 2、代码 设置PB7 //设置PB7 #define SDA_IN() {GPIOB->CRL&0X0FFFFFFF;GPIOB->CRL|(u32)8<<28;} #define SDA_OUT() {GPIOB->…...

django的路由分发
前言: 在前面我们已经学习了基础的Django了,今天我们将继续学习,我们今天学习的是路由分发: 路由分发是Web框架中的一个核心概念,它指的是将不同的URL请求映射到对应的处理函数(视图)的过程。…...

《贪吃蛇小游戏 1.0》源码
好久不见! 终于搞好了简易版贪吃蛇小游戏(C语言版),邀请你来玩一下~ 目录 Snake.h Snake.c test.c Snake.h #include<stdio.h> #include<windows.h> #include<stdbool.h> #include<stdlib.h> #inclu…...