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}")

效果如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/56470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS之一

目录 简介 CSS 语法规范 CSS 代码风格 1.样式格式书写 2.样式大小写 CSS 基础选择器 选择器分类 标签选择器 类选择器 案例之画盒子 多类型使用 id选择器 通配符选择器 font-family设置字体 字体系列 字体大小 字体粗细 文字样式 字体复合属性 示例 CSS 文…

【力扣 | SQL题 | 每日3题】力扣1107,1112, 1077

今天三道mid题都可以用窗口函数轻松秒杀。 1. 力扣1107&#xff1a;每日新用户统计 1.1 题目&#xff1a; Traffic 表&#xff1a; ------------------------ | Column Name | Type | ------------------------ | user_id | int | | activity | enum …

mysql模糊查询优化

mysql模糊查询优化 一、合理使用索引 如下SQL举例&#xff1a; SELECT username,age FROM WHERE username LIKE ‘hysen%’ 如果username字段有索引&#xff0c;前缀匹配会走索引&#xff0c;如 ‘%hysen’或’%hysen%’ 则无法走索引。 二、使用反向索引 对于需要使用后缀…

解决关于HTML+JS + Servlet 实现前后端请求Session不一致的问题

1、前后端不分离情况 在处理session过程中&#xff0c;如果前后端项目在一个容器中&#xff0c;session是可以被获取的。例如如下项目结构&#xff1a; 结构 后端的代码是基本的设置值、获取值、销毁值的内容&#xff1a; 运行结果 由此可见&#xff0c;在前后统一的项目中&a…

Redis 配置小插曲

前言&#xff1a;当今&#xff0c;我们进行后端部署redis时候&#xff0c;总是会遇到各种问题&#xff0c;这不今天就发现了&#xff0c;redis在下载下来的时候&#xff0c;redis.windows.conf&#xff0c;文件中&#xff0c;默认是没有为redis配置密码才被允许进行登录的&…

《Linux从小白到高手》综合应用篇:详解Linux系统调优之服务器硬件优化

List item 本篇介绍Linux服务器硬件调优。硬件调优主要包括CPU、内存、磁盘、网络等关键硬件组。 1. CPU优化 选择适合的CPU&#xff1a; –根据应用需求选择多核、高频的CPU&#xff0c;以满足高并发和计算密集型任务的需求。CPU缓存优化&#xff1a; –确保CPU缓存&#x…

Go语言反射机制详解:通过反射获取结构体的字段和方法

在Go语言中&#xff0c;反射&#xff08;Reflection&#xff09; 是一种强大的工具&#xff0c;允许我们在程序运行时动态地检查和修改变量的类型、 反射在很多场景中都有广泛的应用&#xff0c;如ORM&#xff08;对象关系映射&#xff09;框架、序列化与反序列化工具等。 一、…

SAP导出excel报错:发现“EXPORT.XLSX“中的部分内容有问题。是否让我们尽量尝试恢复?如果您信任此工作簿的源,请单击“是”。

1.问题描述&#xff1a;SAP报表程序导出excel的时报错 2.问题原因 文本信息中包含了非法符号&#xff08;SAP不认识的符号&#xff09; 比如&#xff1a;NLSY10 3.解决方式&#xff0c;把这个文本信息特殊符号去掉&#xff0c;就可以恢复正常了。 怎么找这个特殊符号&#…

2019年计算机网络408真题解析

第一题&#xff1a; 解析&#xff1a;OSI参考模型第5层完成的功能 首先&#xff0c;我们需要对OSI参考模型很熟悉&#xff1a;从下到上依次是&#xff1a;物理层-数据链路层-网络层- 运输层-会话层-表示层-应用层&#xff0c;由此可知&#xff0c;题目要问的是会话层的主要功能…

第十五章 RabbitMQ延迟消息之延迟插件

目录 一、引言 二、延迟插件安装 2.1. 下载插件 2.2. 安装插件 2.3. 确认插件是否生效 三、核心代码 四、运行效果 五、总结 一、引言 上一章我们讲到通过死信队列组合消息过期时间来实现延迟消息&#xff0c;但相对而言这并不是比较好的方式。它的代码实现相对来说比…

嵌入式开发:STM32 硬件 CRC 使用

测试平台&#xff1a;STM32G474系列 STM32硬件的CRC不占用MCU的资源&#xff0c;计算速度快。由于硬件CRC需要配置一些选项&#xff0c;配置不对就会导致计算结果错误&#xff0c;导致使用上没有软件计算CRC方便。但硬件CRC更快的速度在一些有时间资源要求的场合还是非…

编程的魅力

在数字时代的浪潮中&#xff0c;编程已成为连接现实与虚拟世界的桥梁&#xff0c;它不仅塑造了我们的生活方式&#xff0c;还深刻影响着科技进步的每一步。编程&#xff0c;这一看似复杂而神秘的领域&#xff0c;实则蕴含着无限的创造力和可能性。本文将深入探讨编程的魅力、基…

R语言中,.RData 和 .rds 的区别

.RData 和 .rds 是 R 语言中两种不同的数据保存格式&#xff0c;二者有一些关键的区别&#xff1a; 1. 存储内容的类型&#xff1a; .RData 文件&#xff1a;可以同时保存多个对象&#xff08;如数据框、向量、列表等&#xff09;&#xff0c;当你加载 .RData 文件时&#xf…

使用python批量替换文件夹文件名(已亲测)

1. 需要使用高版本的python,本机版本 3.12.4 2. 配置国内Python镜像源 常用的国内Python镜像源&#xff1a; 清华大学TUNA镜像源&#xff1a;这是非常受欢迎的一个镜像源&#xff0c;提供了高速且稳定的服务。 地址&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 临时…

基于DCGM+Prometheus+Grafana的GPU监控方案

目录 前言一、指标导出器1、DCGM&#xff1a;获取远程节点的信息 2、 DCGM-Exporter收集多节点信息更改收集指标 二、 Prometheus - From metrics to insight修改配置文件查看收集结果 三、Grafana仪表板展示导入数据源创建仪表板更多仪表板 前言 基于DCGM&#xff08;NVIDIA …

DNS安全概述

一、DNS的解析过程 1.递归解析 递归解析是一种由DNS客户端&#xff08;通常是用户的应用程序&#xff0c;如一个浏览器&#xff09;向本地DNS解析器发出解析请求&#xff0c;然后本地DNS解析器负责查询最终结果并将结果返回给客户端&#xff0c;而中间的所有查询请求都由本地D…

LabVIEW空间相机测控系统

空间相机是遥感技术中的核心设备&#xff0c;其在太空中的性能对任务的成功至关重要。为了确保空间相机能够在极端环境下稳定工作&#xff0c;地面模拟测试成为必不可少的环节。LabVIEW开发的空间相机测控系统&#xff0c;通过对温度、应力和应变等参数进行高精度测量&#xff…

云贝教育 |【技术文章】OpenTenBase_V2.6基于麒麟V10源码编译安装

本文为云贝教育 刘老师 原创&#xff0c;请尊重知识产权&#xff0c;转发请注明出处&#xff0c;不接受任何抄袭、演绎和未经注明出处的转载。 前言&#xff1a;什么是OpenTenBase OpenTenBase 是一个提供写可靠性&#xff0c;多主节点数据同步的关系数据库集群平台。你可以…

LabVIEW智能可变温循环PCT测试系统

随着全球能源危机的加剧和环境保护需求的提升&#xff0c;开发和利用清洁能源已成为全球必然趋势。氢能作为一种高效的替代能源&#xff0c;正逐步受到关注。然而&#xff0c;储氢技术的研究至关重要&#xff0c;尤其是储氢材料的PCT&#xff08;Pressure-Composition-Temperat…

Python数据分析库pandas高级接口dt的使用

文章目录 Pandas介绍使用示例dt.date()Pandas介绍 Pandas是一个强大的数据分析库,其中dt是Pandas的一个高级接口,用于处理日期和时间数据。dt提供了许多实用的方法和属性,可以轻松地处理日期和时间。 使用示例 下面是一些常用的dt方法和属性的使用示例: 获取日期和时间组…