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.xdnf.cn/news/1557816.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【斯坦福CS144】Lab3

一、实验目的 完成 TCPSender 的四个接口。 二、实验内容 在该实验中&#xff0c;我们需要完成 TCPSender 的以下四个接口&#xff1a; **fill_window&#xff1a;**TCPSender 从 ByteStream 中读取数据&#xff0c;并以 TCPSegement 的形式发送&#xff0c;尽可能地填充接…

多端同步的收银系统源码

随着经济的不断发展&#xff0c;很多门店越来越趋向连锁品牌化&#xff0c;收银系统自然也成为很多连锁门店必不可少的软件工具。希望通过一套软件可以帮助门店解决门店线下销售、会员管理、连锁多门店管理、线下线上一体化、商品库存管理等难题实现降本增效&#xff0c;为了方…

【C++】map详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

ESP8266使用AT指令完成MQTT功能

ESP8266使用AT指令完成MQTT功能 在esp8266设备中烧录安信可的AT固件之后&#xff0c;进行AT指令完成信息发布&#xff0c;并最终实现在Homeassistant中发布传感器并设置传感器状态。 一、基础指令 以下是完整的步骤和对应的AT指令&#xff1a; 1. 配置ESP8266为Station模式 …

10.8学习

1.CAP ★一致性&#xff08;2PC、3PC、Paxos、Raft&#xff09; ●强一致性&#xff1a;数据库一致性&#xff0c;牺牲了性能 ACID&#xff1a;原子性、一致性、隔离性、持久性 ●弱一致性&#xff1a;数据库和缓存&#xff0c;延迟双删、重试 ●单调读一致性&#xff1a;…

[面试] java开发面经-1

前言 目录 1.看到你的简历里说使用Redis缓存高频数据&#xff0c;说一下Redis的操作 2.说一下Redis的缓存击穿、缓存穿透、缓存雪崩 3.你的项目中使用了ThreadLocal&#xff0c;那么当有两个请求同时发出时&#xff0c;会怎么处理&#xff0c;可以同时处理两个请求吗 4.使用…

01_InfluxDb

InFluxDb 概览课程地址Flux语言安装使用场景底层原理-数据结构数据价值热数据冷数据 数据只写不改InFluxDb 1.8 生态InFluxDb查询语言 TelegrafChronograph_画面插件Kapacitor InFluxDb 2.2 生态InFluxDb查询语言 Telegrapf 集群集群方案 概览 时序数据库,对时序场景有特别的优…

java web gis 快速搭建开发环境_服务端搭建

前言: 链接:https://pan.baidu.com/s/15i7FxthazW0J87D5jWh5ng?pwd32nd 提取码:32nd 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 Java 环境 jdk 1.8 &#xff1b; maven ; 中间件: redis 数据库: postgres 1.4 ; postgis 代码管理: git 客户端 开发工…

【每日一题 | 24.10.8】确定字符串是否是另一个的排列

1. 题目2. 解题思路3. 代码实现&#xff08;AC_Code&#xff09; 上期回顾:【每日一题 | 24.10.7】Fizz Buzz 经典问题 个人主页&#xff1a;C_GUIQU 归属专栏&#xff1a;每日一题 1. 题目 确定字符串是否是另一个的排列 2. 解题思路 题目核心要求&#xff1a;理解字符串排列…

使用最小二乘法画噪声数据的近似曲线

文章目录 问题MATLAB代码验证数据1验证数据2 问题 已知有系列含有噪声的数据&#xff08;x , y&#xff09;用最小二乘法计算m和b。(ymxb) MATLAB代码 disp(This promgram perform a leastsquares fit of an); disp(input data set to a straight line.); n_points input(E…

HTB:Tactics[WriteUP]

目录 连接至HTB服务器并启动靶机 1.Which Nmap switch can we use to enumerate machines when our ping ICMP packets are blocked by the Windows firewall? 2.What does the 3-letter acronym SMB stand for? 3.What port does SMB use to operate at? 4.What comma…

python数据分析与可视化工具介绍-numpy库

NumPy&#xff08;Numerical Python的简称&#xff09;&#xff0c;是科学计算基础的一个库&#xff0c;提供了大量关于科学计算的相关功能&#xff0c;例如&#xff0c;线性变换&#xff0c;数据统计&#xff0c;随机数生成等。其提供的最核心的类型为多维数组类型&#xff08…

DAMA数据管理知识体系(第7章 数据安全)

课本内容 7.1 引言 概要 数据安全包括安全策略和过程的规划、建立与执行&#xff0c;为数据和信息资产提供正确的身份验证、授权、访问和审计数据安全来源要求 利益相关方政府法规特定业务关注点合法访问需求合同义务语境关系图 图7-2 语境关系图&#xff1a;数据安全业务驱动因…

微信小程序python+uniapp毕业论文选题系统设计与实现 lj141

目录 项目介绍具体实现截图开发者工具介绍技术路线性能/安全/负载方面开发语言以及框架介绍python-flask核心代码部分展示python-django核心代码部分展示详细视频演示源码获取 项目介绍 考虑到实际生活中在毕业论文选题管理方面的需要以及对该系统认真的分析,将小程序权限按管…

探索循环神经网络RNN:解锁序列数据的奥秘

在这个数据驱动的时代&#xff0c;机器学习模型已经深入到我们生活的方方面面&#xff0c;从智能推荐系统到自然语言处理&#xff0c;无一不彰显其强大的能力。在众多模型中&#xff0c;循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;以其独特的结构和对序…

STM32-HAL库 驱动DS18B20温度传感器 -- 2024.10.8

目录 一、教程简介 二、驱动理论讲解 三、CubeMX生成底层代码 四、Keil5编写代码 五、实验结果 一、教程简介 本教程面向初学者&#xff0c;只介绍DS18B20的常用功能&#xff0c;但也能满足大部分的运用需求。跟着本教程操作&#xff0c;可在10分钟内解决DS18b20通信难题。…

基于uniapp+django微信小程序 食品安全信息管理系统

目录 项目介绍具体实现截图开发者工具介绍技术路线性能/安全/负载方面开发语言以及框架介绍python-flask核心代码部分展示python-django核心代码部分展示详细视频演示源码获取 项目介绍 食品安全信息管理系统设计的目的是为用户提供食品信息、科普专栏、食品检测、检测结果、交…

Chromium 中js Fetch API接口c++代码实现(二)

Chromium 中JavaScript Fetch API接口c代码实现&#xff08;一&#xff09;-CSDN博客 接着上一篇继续介绍调用&#xff0c;上函数堆栈。 1、打开http://192.168.8.1/chfs/shared/test/test02.html 此标签进程ID12484&#xff0c; 2、打开vs附加上此进程ID12484 3、点击页面测…

Java--IO高级流

缓冲流 缓冲流,也叫高效流&#xff0c;是对4个基本的FileXxx 流的增强&#xff0c;所以也是4个流&#xff0c;按照数据类型分类&#xff1a; 字节缓冲流&#xff1a;BufferedInputStream&#xff0c;BufferedOutputStream 字符缓冲流&#xff1a;BufferedReader&#xff0c;Buf…

用友Yonbuilder 平台使用教程序

用友Yonbuilder 平台使用教程 目录概述需求&#xff1a; 设计思路实现思路分析 免费下载参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,c…