【爬虫】解析爬取的数据

目录

  • 一、正则表达式
    • 1、常用元字符
    • 2、量词
    • 3、Re模块
    • 4、爬取豆瓣电影
  • 二、Xpath
    • 1、Xpath解析
      • Ⅰ、节点选择
      • Ⅱ、路径表达式
      • Ⅲ、常用函数
    • 2、爬取豆瓣电影


解析数据,除了前面的BeautifulSoup库,还有正则表达式和Xpath两种方法。

一、正则表达式

正则表达式(简称RE)是一种用来描述和匹配字符串模式的工具。

它广泛应用于文本处理、数据验证、文本搜索和替换等场景。正则表达式使用一种特殊的语法,可以对字符串进行复杂的模式匹配。

正则表达式测试:在线正则表达式测试

1、常用元字符

元字符:具有固定含义的特殊符号。每个元字符,默认只匹配一个字符串,并且不能匹配换行符。

元字符描述示例
.匹配除换行符以外的任意字符a.b 可以匹配 a1bacb
\w匹配字母、数字或下划线\w+ 匹配 helloworld_123
\s匹配任意的空白字符\s+ 匹配空格、制表符等
\d匹配数字\d+ 匹配 123456
\n匹配一个换行符hello\nworld 匹配换行符
\t匹配一个制表符hello\tworld 匹配制表符
^匹配字符串的开始^Hello 匹配 Hello 开头的字符串
$匹配字符串的结束World$ 匹配 World 结尾的字符串
\W匹配非字母、非数字、非下划线的字符\W+ 匹配 !@#$%^
\D匹配非数字字符\D+ 匹配 abcXYZ
\S匹配非空白字符\S+ 匹配 helloworld123
`ab`匹配字符 a 或字符 b
(...)捕获括号内的表达式,表示一个组(abc) 捕获 abc
[...]匹配方括号中的任意字符[abc] 匹配 abc
[^...]匹配不在方括号中的任意字符[^abc] 匹配除 abc 之外的任意字符

2、量词

量词:控制前面的元字符出现的次数

量词描述
*重复零次或更多次
+重复一次或更多次
?重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次

惰性匹配.*?:尽可能少地匹配字符。在重复元字符后加 ? 实现惰性匹配。
贪婪匹配.*:尽可能多地匹配字符。默认的重复元字符都是贪婪的。

惰性匹配

贪婪匹配

3、Re模块

在Python中使用处理正则表达式,可以使用 re 模块,这个模块提供了一系列用于搜索、匹配和操作字符串的函数。

函数描述
re.search(pattern, string, flags=0)搜索字符串,返回第一个匹配的对象;若无匹配返回 None
re.match(pattern, string, flags=0)从字符串起始位置匹配模式;若匹配成功返回匹配对象,否则 None
re.fullmatch(pattern, string, flags=0)整个字符串完全匹配模式返回匹配对象,否则返回 None
re.findall(pattern, string, flags=0)返回字符串中所有非重叠匹配的列表
re.finditer(pattern, string, flags=0)返回字符串中所有非重叠匹配的迭代器
re.sub(pattern, repl, string, count=0, flags=0)用替换字符串替换匹配模式的所有部分,返回替换后的字符串
re.split(pattern, string, maxsplit=0, flags=0)根据模式匹配分割字符串,返回分割后的列表
import re# 示例文本
text = "在2024年,Python是最受欢迎的编程语言之一。Python 3.9版本在2020年发布。"# 1. re.search() 搜索字符串,返回第一个匹配的对象
# 查找第一个数字序列
search_result = re.search(r'\d+', text)
if search_result:print(f"re.search: 找到的第一个数字是 '{search_result.group()}',位置在 {search_result.start()}")  # 2. re.match() 从字符串起始位置匹配模式
# 匹配字符串开头是否为 '在'
match_result = re.match(r'在', text)
if match_result:print(f"re.match: 匹配的字符串是 '{match_result.group()}',位于字符串的开始")# 3. re.fullmatch() 整个字符串完全匹配模式
# 检查整个字符串是否只包含中文字符
fullmatch_result = re.fullmatch(r'[\u4e00-\u9fff]+', '在编程')
if fullmatch_result:print(f"re.fullmatch: 整个字符串完全匹配,匹配到的内容是 '{fullmatch_result.group()}'")  # 4. re.findall() 返回字符串中所有非重叠匹配的列表
# 查找所有的数字序列
findall_result = re.findall(r'\d+', text)
print(f"re.findall: 找到的所有数字序列是 {findall_result}") # 5. re.finditer() 返回字符串中所有非重叠匹配的迭代器
# 查找所有的数字序列,并逐一输出
finditer_result = re.finditer(r'\d+', text)
for match in finditer_result:print(f"re.finditer: 找到的数字是 '{match.group()}',位置在 {match.start()}")  # 6. re.sub() 用替换字符串替换匹配模式的所有部分
# 将所有数字替换为 '#'
sub_result = re.sub(r'\d+', '#', text)
print(f"re.sub: 替换后的字符串是: {sub_result}") # 7. re.split() 根据模式匹配分割字符串
# 按照空白字符或标点分割字符串
split_result = re.split(r'[,。 ]+', text)
print(f"re.split: 分割后的字符串列表是: {split_result}") 

image-20240608195856954

4、爬取豆瓣电影

image-20240608200527961

<li>标签开始,逐步匹配到包含电影名的<span class="title">标签,使用非贪婪模式(.*?)匹配中间可能存在的任意字符,直到找到下一个明确的标记,用命名捕获组(?P<name>)提取出电影名部分。

Re表达式写法:

<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)</span>

爬虫代码:

import requests
import re
from bs4 import BeautifulSoupheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0"
}for start_num in range(0, 250, 25):response = requests.get(f"https://movie.douban.com/top250?start={start_num}", headers=headers)# 拿到页面源代码html = response.text# 使用re解析数据obj = re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)</span>',re.S)# 开始匹配result = obj.finditer(html)# 打印结果for it in result:print(it.group('name'))

二、Xpath

Xpath是在XML文档中搜索的一门语言,它可以通过路径表达式来选择节点或节点集,HTML是XML的一个子集。

安装lxml模块: pip install lxml

1、Xpath解析

Ⅰ、节点选择

符号解释
/从根节点选择。
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
.选择当前节点。
..选择当前节点的父节点。
@选择属性。

Ⅱ、路径表达式

表达式解释
/bookstore/book选择bookstore节点下的所有book子节点。
//book选择文档中的所有book节点,不考虑它们的位置。
bookstore/book[1]选择bookstore节点下的第一个book子节点。
//title[@lang]选择所有具有lang属性的title节点。
//title[@lang='en']选择所有lang属性为’en’的title节点。

Ⅲ、常用函数

  • text(): 选择元素的文本。
  • @attr: 选择元素的属性。
  • contains(): 判断包含关系。
  • starts-with(): 判断开始部分。
from lxml import etreehtml_content = '''
<html><body><div class="movie"><span class="title">肖申克的救赎</span><span class="title">The Shawshank Redemption</span></div><div class="movie"><span class="title">霸王别姬</span><span class="title">Farewell My Concubine</span></div></body>
</html>
'''# 解析HTML
tree = etree.HTML(html_content)# 提取电影标题
titles_cn = tree.xpath('//div[@class="movie"]/span[@class="title"][1]/text()')
titles_en = tree.xpath('//div[@class="movie"]/span[@class="title"][2]/text()')# 打印结果
for cn, en in zip(titles_cn, titles_en):print(f'中文标题: {cn}, 英文标题: {en}')
//div[@class="movie"]/span[@class="title"][1]/text()

//div[@class="movie"]:选择所有class为movie的div元素。

/span[@class="title"][1]:选择每个div中class为title的第一个span元素。

/text():获取span元素的文本内容。

//div[@class="movie"]/span[@class="title"][2]/text()

类似上述表达式,但选择的是每个div中class为title的第二个span元素。

2、爬取豆瓣电影

豆瓣

import requests
from lxml import etreeheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0"
}for start_num in range(0, 250, 25):response = requests.get(f"https://movie.douban.com/top250?start={start_num}", headers=headers)# 拿到页面源代码html = response.text# 使用lxml解析页面html = etree.HTML(html)# 提取电影名字titles = html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()')# 提取评分ratings = html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/div/span[2]/text()')# 打印结果for title, rating in zip(titles, ratings):print(f"电影: {title} 评分: {rating}")

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

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

相关文章

C++|智能指针

目录 引入 一、智能指针的使用及原理 1.1RAII 1.2智能指针原理 1.3智能指针发展 1.3.1std::auto_ptr 1.3.2std::unique_ptr 1.3.3std::shared_ptr 二、循环引用问题及解决方法 2.1循环引用 2.2解决方法 三、删除器 四、C11和boost中智能指针的关系 引入 回顾上…

谷粒商城学习笔记-19-快速开发-逆向生成所有微服务基本CRUD代码

文章目录 一&#xff0c;使用逆向工程步骤梳理1&#xff0c;修改逆向工程的application.yml配置2&#xff0c;修改逆向工程的generator.properties配置3&#xff0c;以Debug模式启动逆向工程4&#xff0c;使用逆向工程生成代码5&#xff0c;整合生成的代码到对应的模块中 二&am…

VMware Workstation 虚拟机网络配置为与主机使用同一网络

要将 VMware Workstation 虚拟机网络配置为与主机使用同一网络&#xff0c;我们需要将虚拟机的网络适配器设置为桥接模式。具体步骤如下&#xff1a; 配置 VMware Workstation 虚拟机网络为桥接模式 打开 VMware Workstation&#xff1a; 启动 VMware Workstation。 选择虚拟机…

实验场:在几分钟内使用 Bedrock Anthropic Models 和 Elasticsearch 进行 RAG 实验

作者&#xff1a;来自 Elastic Joe McElroy, Aditya Tripathi 我们最近发布了 Elasticsearch Playground&#xff0c;这是一个新的低代码界面&#xff0c;开发人员可以通过 A/B 测试 LLM、调整提示&#xff08;prompt&#xff09;和分块数据来迭代和构建生产 RAG 应用程序。今天…

Web3学习路线图,从入门到精通

前面我们聊了Web3的知识图谱&#xff0c;内容是相当的翔实&#xff0c;要从哪里入手可以快速的入门Web3&#xff0c;本篇就带你看看Web3的学习路线图&#xff0c;一步一步深入学习Web3。 这张图展示了Web3学习路线图&#xff0c;涵盖了区块链基础知识、开发方向、应用开发等内…

接上一回C++:补继承漏洞+多态原理(带图详解)

引子&#xff1a;接上一回我们讲了继承的分类与六大默认函数&#xff0c;其实继承中的菱形继承是有一个大坑的&#xff0c;我们也要进入多态的学习了。 注意&#xff1a;我学会了&#xff0c;但是讲述上可能有一些不足&#xff0c;希望大家多多包涵 继承复习&#xff1a; 1&…

windows环境下基于3DSlicer 源代码编译搭建工程开发环境详细操作过程和中间关键错误解决方法说明

说明: 该文档适用于  首次/重新 搭建3D-Slicer工程环境  Clean up(非增量) 编译生成 1. 3D-slicer 软件介绍 (1)3D Slicer为处理MRI\CT等图像数据软件,可以实行基于MRI图像数据的目标分割、标记测量、坐标变换及三维重建等功能,其源于3D slicer 4.13.0-2022-01-19开…

OS Copilot测评

1.按照第一步管理重置密码时报错了,搞不懂为啥?本来应该跳转到给的那个实例的,我的没跳过去 2.下一步重置密码的很丝滑没问题 3安全组新增入库22没问题 很方便清晰 4.AccessKey 还能进行预警提示 5.远程连接,网速还是很快,一点没卡,下载很棒 6.替换的时候我没有替换<>括…

【JavaEE】网络编程——UDP

&#x1f921;&#x1f921;&#x1f921;个人主页&#x1f921;&#x1f921;&#x1f921; &#x1f921;&#x1f921;&#x1f921;JavaEE专栏&#x1f921;&#x1f921;&#x1f921; 文章目录 1.数据报套接字(UDP)1.1特点1.2编码1.2.1DatagramSocket1.2.2DatagramPacket…

Spring Cloud Alibaba AI 介绍及使用

一、Spring Cloud Alibaba AI 介绍 Spring AI 是 Spring 官方社区项目&#xff0c;旨在简化 Java AI 应用程序开发&#xff0c;让 Java 开发者像使用 Spring 开发普通应用一样开发 AI 应用。而 Spring Cloud Alibaba AI 是阿里以 Spring AI 为基础&#xff0c;并在此基础上提供…

dive deeper into tensor:从底层开始学习tensor

inspired by karpathy/micrograd: A tiny scalar-valued autograd engine and a neural net library on top of it with PyTorch-like API (github.com)and Taking PyTorch for Granted | wh (nrehiew.github.io). 这属于karpathy的karpathy/nn-zero-to-hero: Neural Networks…

阐述 C 语言中的参数传递机制

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&#xff0c;看过的人都说好。 文章目…

多表查询sql

概述&#xff1a;项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系&#xff0c;分为三种&#xff1a; 一对多多对多一对一 一、多表关系 一对多 案例&#xff1a;部门与…

【PowerShell】-1-快速熟悉并使用PowerShell

目录 PowerShell是什么&#xff1f;和CMD的区别&#xff1f; PowerShell的演变 自动化IT管理任务 一些名词 详尽的PowerShell开始之路 1.打开PowerShell&#xff1a; 2.基本命令&#xff1a; &#xff08;1&#xff09;Get-Process &#xff08;2&#xff09;变量赋值…

【核心笔记】Java入门到起飞,小白都能看懂的Java教程 (五)——数组

一 数组的定义和初始化 定义数组 数据类型[] 数组名&#xff1b;例 int[] arr; 数据类型 数组名[]&#xff1b;例 int arr[]; 数组初始化 数据类型[] 数组名 new 数据类型[] {值}&#xff1b;例 int[] arr new int[] {1,2,3}; &#xff08;简化形式&#xff09;数据类型[] 数…

超赞!只需粘贴复制超赞,视频快速转换成文章

大家好&#xff01;我是闷声轻创&#xff01;是否还在为撰写高质量的文章而熬夜奋战&#xff1f;今天&#xff0c;我要给你们带来一个超级棒的消息——视频变文章的神奇工具&#xff0c;让你的创作之路从此不再艰辛&#xff01; 视频素材的宝藏——油管&#xff08;YTB&#xf…

2024年了还在学pytestday1

1、按照博主的说法&#xff0c;提出疑问&#xff1a;应该在电脑本地终端安装还是在pythoncharm终端安装&#xff1f; ------在pythoncharm终端安装就行 避免老是忘记&#xff0c;还是记下来比较好。 2、在公司安装不成功&#xff0c;换豆瓣源也不行&#xff0c;连接手机热点尝…

Linux--安装VMware步骤

安装VMware VMware Desktop Hypervisors for Windows, Linux, and Mac 复制链接打开浏览器下载即可 从官网下载软件&#xff0c;完成后为确保后续正常使用&#xff0c;需要检查虚拟网卡是否安装完成 检查虚拟网卡的安装步骤 Windows--设置--高级设置--网络适配器--看是否有显…

STM32杂交版(HAL库、音乐盒、闹钟、点阵屏、温湿度)

一、设计描述 本设计精心构建了一个以STM32MP157A高性能单片机为核心控制单元的综合性嵌入式系统。该系统巧妙融合了蜂鸣器、数码管显示器、点阵屏、温湿度传感器、LED指示灯以及按键等多种外设模块&#xff0c;形成了一个功能丰富、操作便捷的杂交版智能设备。通过串口…

vue2学习笔记-官网使用指南和搭建开发环境

官网使用指南 官网地址&#xff1a;介绍 — Vue.js 1、学习 1.1 教程和API 最重要的两个板块。API是VUE的字典&#xff0c;需要时来查阅。 1.2、风格指南 如何写出风格优雅的VUE代码。规则分为四类&#xff1a;必要的&#xff0c;强烈推荐、推荐、谨慎使用。 1.3、示例 …