当前位置: 首页 > news >正文

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 只会匹配 abd 之间的字符,结果是 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 # 匹配任意一个单词字符&#xff08;数字、字母、下划线&#xff09; \W # 匹配任意一个非单词字符 . # 匹配任意一个字符&#xff08;除了换行符&#xff09; [a-z] # 匹配任意一个小写字母 […...

Jenkins打包,发布,部署

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

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进行注入&#xff0c;构造post语句 unameaaa"passwdbbb&SubmitSubmit 页面报错&#xff0c;根据分析&#xff0c;闭合方式". 确定列数 构造 unameaaa" or 11 # &passwdbbb&SubmitSubmit 确定存在注…...

Python开发环境配置(mac M2)

1. 前言 作为一名程序员&#xff0c;工作中需要使用Python进行编程&#xff0c;甚至因为项目需要还得是不同版本的Python如何手动管理多个版本的Python&#xff0c;如何给Pycharm&#xff08;IDE&#xff09;配置对应的interpreter等&#xff0c;都成为一个 “不熟练工” 的难…...

其他: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 中隐藏元素刷新闪烁问题

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

【MySQL】数据目录迁移

一、使用场景 使用该方法一般是数据目录所在磁盘不支持扩展&#xff0c;只能通过新加磁盘来扩展数据目录磁盘空间。通常是Windows服务器&#xff0c;或者是Linux服务器的mysql数据目录的磁盘没有使用lvm。 二、准备工作 1. 新磁盘初始化&#xff0c;达到可使用状态 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终端安全保障 资料获取&#xff1a;私信或者进主页。…...

INS淡绿色风格人像街拍Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍 INS 淡绿色风格人像街拍通过 Lightroom 调色可以营造出清新、自然、时尚的视觉效果。这种风格以淡绿色为主色调&#xff0c;给人一种宁静、舒适的感觉。 预设信息 调色风格&#xff1a;INS风格预设适合类型&#xff1a;人像&#xff0c;街拍&#xff0c;自拍&#…...

python 实现最小路径和算法

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

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+大恒相机相机回调方式总结

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

Python库pandas之六

Python库pandas之六 输入/输出read_sql函数应用实列 输入/输出 read_sql 函数 词法&#xff1a;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进行实例分割是一项具有挑战性的任务&#xff0c;因为YOLOv11通常是用PyTorch等深度学习框架实现的&#xff0c;而OpenCV本身并不直接支持加载和运行PyTorch模型。然而&#xff0c;可以通过一些间接的方法来实现这一目标&#x…...

PAT甲级-1122 Hamiltonian Cycle

题目 题目大意 给定一个图和几组顶点&#xff0c;判断每组顶点是否能构成一个哈密顿回路。 知识点 哈密顿回路满足几点要求&#xff1a;构成一个封闭环&#xff0c;并且经过所有顶点&#xff0c;每个顶点经过一次。 即满足第一个顶点值和最后一个顶点值相等&#xff1b;只有…...

Java 插入排序

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

随机掉落的项目足迹:Vue3中vite.config.ts配置代理服务器解决跨域问题

跨域问题产生的原因&#xff1a;浏览器同源策略 后面的通俗解释小标题下的内容是便于大家理解同源策略和跨域问题。 而同源策略和跨域问题这两个小标题下的内容虽然比较专业不容易阅读&#xff0c;但是还是建议大家花时间理解并记忆&#xff0c;因为这是前端面试中的常考点。…...

C++笔记之标准库和boost库中bind占位符_1的写法差异

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

二分查找

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

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…...

算法刷题-回溯

今天给大家分享的还是一道关于dfs回溯的问题&#xff0c;对于这类问题大家还是要多刷和总结&#xff0c;总体难度还是偏大。 对于回溯问题有几个关键点&#xff1a; 1.首先对于这类回溯可以节点可以随机选择的问题&#xff0c;要做mian函数中循环调用dfs&#xff08;i&#x…...

MLP实战二:MLP 实现图像数字多分类

任务 实战&#xff08;二&#xff09;&#xff1a;MLP 实现图像多分类 基于 mnist 数据集&#xff0c;建立 mlp 模型&#xff0c;实现 0-9 数字的十分类 task: 1、实现 mnist 数据载入&#xff0c;可视化图形数字&#xff1b; 2、完成数据预处理&#xff1a;图像数据维度转换与…...

触发DMA传输错误中断问题排查

在STM32项目中&#xff0c;集成BLE模块后触发DMA传输错误中断&#xff08;DMA2_Stream1_IRQHandler进入错误流程&#xff09;&#xff0c;但单独运行BLE模块时正常&#xff0c;表明问题可能源于原有线程与BLE模块的交互冲突。以下是逐步排查与解决方案&#xff1a; 一、问题根源…...

Python[数据结构及算法 --- 栈]

一.栈的概念 在 Python 中&#xff0c;栈&#xff08;Stack&#xff09;是一种 “ 后进先出&#xff08;LIFO&#xff09;”的数据结构&#xff0c;仅允许在栈顶进行插入&#xff08;push&#xff09;和删除&#xff08;pop&#xff09;操作。 二.栈的抽象数据类型 1.抽象数…...

2025年ESWA SCI1区TOP,自适应学习粒子群算法AEPSO+动态周期调节灰色模型,深度解析+性能实测

目录 1.摘要2.粒子群算法PSO原理3.改进策略4.结果展示5.参考文献6.代码获取7.算法辅导应用定制读者交流 1.摘要 能源数据的科学预测对于能源行业决策和国家经济发展具有重要意义&#xff0c;尤其是短期能源预测&#xff0c;其精度直接影响经济运行效率。为了更好地提高预测模型…...