深入解析 Python 中 Parsel 的两种数据提取方式

更多资料获取

📚 个人网站:ipengtao.com


在网络爬虫的世界中,数据提取是至关重要的一环。Python 提供了许多强大的工具,其中之一就是 parsel 库,专门用于解析和提取 HTML 或 XML 数据。本篇博客将深入探讨 parsel 中两种主要的数据提取方式:基于 XPath 和 CSS 选择器。通过丰富的示例代码,我们将一步步了解如何使用这两种方法来有效地提取所需的数据。

XPath 数据提取

什么是 XPath?

XPath 是一种用于在 XML 或 HTML 文档中定位元素的查询语言。在 parsel 中,我们可以使用 xpath() 方法应用 XPath 表达式。让我们从一个简单的例子开始:

from parsel import Selectorhtml_content = """
<html><body><div class="container"><h1>Hello, World!</h1><p>This is a sample paragraph.</p></div></body>
</html>
"""selector = Selector(text=html_content)# 使用 XPath 获取标题文本
title_text = selector.xpath('//h1/text()').get()
print("Title:", title_text)# 使用 XPath 获取段落文本
paragraph_text = selector.xpath('//p/text()').get()
print("Paragraph:", paragraph_text)

在这个例子中,使用 XPath 表达式 //h1/text() 获取了 <h1> 元素的文本内容,同样,使用 //p/text() 获取了 <p> 元素的文本内容。

优点和缺点

XPath 的优势:
  1. 灵活性: XPath 提供了强大的灵活性,可以使用多种条件和轴定位元素。这使得在复杂的文档结构中准确定位特定数据变得相对容易。

  2. 表达能力: XPath 表达式可以描述节点之间的关系,允许我们以更复杂的方式选择和提取数据。这在处理具有深层次嵌套结构的文档时非常有用。

  3. 功能丰富: XPath 支持一系列函数,例如字符串处理、数学运算等,使得数据提取的操作更加强大和灵活。

XPath 的缺点:
  1. 表达式相对较长: 有时,XPath 表达式可能相对较长,尤其是在描述复杂结构或需要深度定位的情况下。这可能使代码显得冗长和不够直观。

  2. 学习曲线: XPath 的语法相对复杂,对于初学者来说可能需要一些时间来理解和掌握。与简单的选择器语法相比,XPath 学习曲线较陡。

  3. 性能: 在某些情况下,XPath 的性能可能略逊于 CSS 选择器。对于大型文档或需要高性能的应用,可能需要考虑性能方面的因素。

综合考虑这些优缺点,XPath 在处理复杂结构和需要灵活性的场景中表现出色,但在简单任务和代码直观性方面可能略显不足。在实际应用中,根据任务的性质和个人偏好选择合适的方法是至关重要的。

CSS 选择器数据提取

什么是 CSS 选择器?

与 XPath 类似,CSS 选择器是一种用于选择 HTML 元素的语法。在 parsel 中,我们可以使用 css() 方法通过 CSS 选择器获取元素。看下面的例子:

# 使用 CSS 选择器获取标题文本
title_text_css = selector.css('h1::text').get()
print("Title (CSS):", title_text_css)# 使用 CSS 选择器获取段落文本
paragraph_text_css = selector.css('p::text').get()
print("Paragraph (CSS):", paragraph_text_css)

在这个例子中,我们使用 CSS 选择器 h1::text 获取了 <h1> 元素的文本内容,同样,使用 p::text 获取了 <p> 元素的文本内容。

优点和缺点

CSS 选择器的优势:
  1. 简洁和直观: CSS 选择器通常语法简洁,易读易理解。这使得在处理一些简单的数据提取任务时,CSS 选择器是更为直观和方便的选择。

  2. 学习曲线较低: 相对于 XPath,CSS 选择器的学习曲线较低。对于初学者来说,更容易上手,能够快速掌握基本的选择和提取操作。

  3. 性能: 在某些情况下,CSS 选择器的性能可能略优于 XPath。对于大型文档或对性能要求较高的应用,CSS 选择器可能是更好的选择。

CSS 选择器的缺点:
  1. 限制较多: CSS 选择器的功能相对较为有限,不能像 XPath 那样灵活。在处理复杂的文档结构时,可能需要进行多次选择和处理,增加了代码的复杂性。

  2. 不支持某些功能: CSS 选择器不支持一些 XPath 的高级功能,如轴选择。这在某些情况下可能限制了对于特定数据的准确定位。

  3. 不能描述父节点关系: CSS 选择器不能像 XPath 那样直接描述父节点关系,这在一些需要从父节点开始定位的情况下可能显得不够灵活。

实际应用示例

在这个实际的应用示例中,将使用 parsel 库从一个简单的博客网站中提取文章的标题和摘要信息。这个任务将涵盖如何结合使用 XPath 和 CSS 选择器来有效地定位和提取所需的数据。

首先,需要模拟博客网站的HTML结构:

# 模拟博客网站的HTML结构
blog_html_content = """
<html><body><div class="article"><h2 class="title">Python爬虫入门</h2><p class="summary">学习如何使用Python进行简单而强大的网络爬虫。</p></div><div class="article"><h2 class="title">数据分析与可视化</h2><p class="summary">探索数据分析和可视化的奥秘,使用Python的强大工具。</p></div><!-- 更多文章... --></body>
</html>
"""# 使用 parsel 创建选择器对象
selector_blog = Selector(text=blog_html_content)

接下来,将结合使用 XPath 和 CSS 选择器提取文章的标题和摘要信息:

# 使用 XPath 提取文章标题和摘要
titles_xpath = selector_blog.xpath('//h2[@class="title"]/text()').getall()
summaries_xpath = selector_blog.xpath('//p[@class="summary"]/text()').getall()# 使用 CSS 选择器提取文章标题和摘要
titles_css = selector_blog.css('h2.title::text').getall()
summaries_css = selector_blog.css('p.summary::text').getall()# 打印结果
for i in range(len(titles_xpath)):print(f"Article {i + 1}")print("  Title (XPath):", titles_xpath[i])print("  Summary (XPath):", summaries_xpath[i])print("  Title (CSS):", titles_css[i])print("  Summary (CSS):", summaries_css[i])print("\n")

在这个示例中,通过使用 XPath 和 CSS 选择器分别提取了文章的标题和摘要信息。通过比较两种方法的结果,可以更好地理解在实际应用中如何选择合适的定位方式。

通过运行上述代码,将得到类似以下的输出:

Article 1Title (XPath): Python爬虫入门Summary (XPath): 学习如何使用Python进行简单而强大的网络爬虫。Title (CSS): Python爬虫入门Summary (CSS): 学习如何使用Python进行简单而强大的网络爬虫.Article 2Title (XPath): 数据分析与可视化Summary (XPath): 探索数据分析和可视化的奥秘,使用Python的强大工具。Title (CSS): 数据分析与可视化Summary (CSS): 探索数据分析和可视化的奥秘,使用Python的强大工具.

这个实际应用示例将帮助读者更好地理解如何在真实的爬虫任务中使用 parsel 库提取有用的信息。可以根据自己的实际需求修改示例代码,并尝试在其他网站上应用相似的技术。

总结

在本文中,深入探讨了在 Python 中使用 parsel 库进行数据提取的两种主要方式:基于 XPath 和 CSS 选择器。通过丰富的示例代码,详细介绍了这两种方法的优势和缺点。XPath 被赞誉为灵活性强,适用于复杂文档结构,但表达式相对较长。与之相比,CSS 选择器简洁直观,学习曲线较低,尤其适用于简单任务。

在实际应用示例中,模拟了一个博客网站的 HTML 结构,并展示了如何使用 parsel 结合 XPath 和 CSS 选择器提取文章的标题和摘要信息。通过比较两种方法的结果,可以更好地理解在实际爬虫任务中如何选择合适的定位方式。

总体而言,parsel 为数据提取提供了强大而灵活的工具,使得在不同的场景中能够选择最适合的方法。在实践中,根据任务的性质和个人偏好选择 XPath 或 CSS 选择器,将有助于提高爬虫代码的效率和可维护性。


Python学习路线

在这里插入图片描述

更多资料获取

📚 个人网站:ipengtao.com

如果还想要领取更多更丰富的资料,可以点击文章下方名片,回复【优质资料】,即可获取 全方位学习资料包。

在这里插入图片描述
点击文章下方链接卡片,回复【优质资料】,可直接领取资料大礼包。

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

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

相关文章

信贷专员简历模板

这份简历内容&#xff0c;以信贷专员招聘需求为背景&#xff0c;我们制作了1份全面、专业且具有参考价值的简历案例&#xff0c;大家可以灵活借鉴。 信贷专员简历在线编辑下载&#xff1a;百度幻主简历 求职意向 求职类型&#xff1a;全职 意向岗位&#xff1a;信贷专员 …

LRU缓存淘汰策略的实现——LinkedHashMap哈希链表

LRU&#xff08;最近最少使用&#xff09;缓存淘汰策略可以通过使用哈希链表实现。LinkedHashMap 是 Java 中提供的一种数据结构&#xff0c;它综合了哈希表和双向链表的特点&#xff0c;非常适合用来实现 LRU 缓存。 LinkedHashMap 内部维护了一个哈希表和一个双向链表。哈希…

使用Jetty编写RESTful接口

一、依赖 <!--Jetty服务器的核心依赖项&#xff0c;用于创建和管理服务器。--><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-server</artifactId><version>9.4.43.v20210629</version></dependency…

spring框架的事务传播级别经典篇

一 spring事务传播级别 1.1 总结概述 方法A:外围方法&#xff0c;方法B&#xff1a;内部方法&#xff0c;在A中调用B 1.事务级别PROPAGATION_REQUIRED&#xff1a; 如果A为PROPAGATION_REQUIRED&#xff1a;B 不管有没有设置事务级别&#xff0c;都会加入到A的事务级别中。如…

【驱动】串口驱动分析(四)-串口编程和调试方法

串口调试 串口调试主要有 根据/proc系统信息确认串口状态&#xff0c;stty命令&#xff0c;编程调试 三种调试方法&#xff0c;下面我们分别具体介绍下。 根据设备节点确认串口是否正常 系统上电时&#xff0c;默认会使能串口&#xff0c;我们可以通过dmesg | grep ttyS 查看…

SSM6 11-27 SpringMvc过滤器和异常处理

try catch:处理异常 throw/throws:不处理 抛出 jvm中断程序运行 打印错误信息 web:经典三层模型&#xff1a; dao(mapper) service web层 异常抛给web层Controller类的方法&#xff0c;每个方法可能处理异常,可能处理异常代码相似,造成重复代码重复编写 web层再往上抛 …

【驱动】串口驱动分析(二)-tty core

前言 tty这个名称源于电传打字节的简称&#xff0c;在linux表示各种终端&#xff0c;终端通常都跟硬件相对应。比如对应于输入设备键盘鼠标&#xff0c;输出设备显示器的控制终端和串口终端。也有对应于不存在设备的pty驱动。在如此众多的终端模型之中&#xff0c;linux是怎么…

Flutter使用flutter_gen管理资源文件

pub地址&#xff1a; https://pub.dev/packages/flutter_gen 1.添加依赖 在你的pubspec.yaml文件中添加flutter_gen作为开发依赖 dependencies:build_runner:flutter_gen_runner: 2.配置pubspec.yaml 在pubspec.yaml文件中&#xff0c;配置flutter_gen的参数。指定输出路…

《C++ Primer》第10章 算法(二)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 10.4 再探迭代器&#xff08;P357&#xff09; 除了为每个容器定义的迭代器外&#xff0c;头文件 iterator 中还定义了额外的几种迭代器&#xff1a; 插入迭代器&#xff08;insert iterator&#xff09;&…

Selenium 连接到现有的 Google Chrome 示例

python 3.7 selenium 3.14.1 urllib3 1.26.8 Google Chrome 119.0.6045.160 (64位) chromedriver.exe 119.0.6045.105(win32) 1 Google Chrome 添加参数 "--remote-debugging-port9222" 2 测试效果(chromedriver.exe 要和 Google Chrome 版本…

vue3 router-view 使用keep-alive报错parentcomponent.ctx.deactivate is not a function

问题 如下图&#xff0c;在component组件上添加v-if判断&#xff0c;会报错: parentcomponent.ctx.deactivate is not a function 解决方法 去除v-if&#xff0c;将key直接添加上。由于有的公用页面&#xff0c;需要刷新&#xff0c;不希望缓存&#xff0c;所以需要添加key…

分支和循环

通常来说&#xff0c;C语言是结构化的程序设计语言&#xff0c;这里的结构包括顺序结构、选择结构、循环结构&#xff0c;C语言能够实现这三种结构&#xff0c;如果我们仔细分析&#xff0c;我们日常生活中所见的事情都可以拆分为这三种结构或者它们的组合。 下面我会仔细讲解我…

【人工智能Ⅰ】实验4:贝叶斯分类

实验4 贝叶斯分类 一、实验目的 1. 了解并学习机器学习相关库的使用。 2. 熟悉贝叶斯分类原理和方法&#xff0c;并对MNIST数据集进行分类。 二、实验内容 1. 使用贝叶斯方法对mnist或mnist variation数据集进行分类&#xff0c;并计算准确率。数据集从网上下载&#xff0…

vue.js ——Vuex

基本概念 vue进行开发过程中有没有遇到这样一种场景&#xff0c;就是有些时候一些数据是一种通用的共享数据&#xff08;比如登录信息&#xff09;&#xff0c;那么这类数据在各个组件模块中可能都会用到&#xff0c;如果每个组件中都去后台重新获取那么势必会造成性能浪费&am…

websocket 消息包粗解

最近在搞websocket解析&#xff0c;记录一下: 原始字符串 &#xfffd;~&#xfffd;{"t":"d","d":{"b":{"p":"comds/comdssqmosm7k","d":{"comdss":{"cmdn":"success",…

免费使用GPT的网站

登录ChatGPT系统 登录ChatGPT系统 登录ChatGPT系统

ArkTs变量类型、数据类型基础语法

可以参考官网学习路径学习HarmonyOS第一课|应用开发视频教程学习|HarmonyOS应用开发官网 ArkTS是华为自研的开发语言。它在TypeScript&#xff08;简称TS&#xff09;的基础上&#xff0c;匹配ArkUI框架&#xff0c;扩展了声明式UI、状态管理等相应的能力&#xff0c;让开发者以…

浅谈安科瑞ASJ继电器在菲律宾矿厂的应用

摘要&#xff1a;对电气线路进行接地故障保护&#xff0c;方式接地故障电流引起的设备和电气火灾事故越来越成为日常所需。针对用户侧主要的用能节点&#xff0c;设计安装剩余电流继电器&#xff0c;实时监控各用能回路的剩余电流状态。通过实时监控用能以及相关电力参数、提高…

ESP32-Web-Server编程- 通过 Highcharts 创建图表(Chart)实时显示设备信息

ESP32-Web-Server编程- 通过 Highcharts 创建图表&#xff08;Chart&#xff09;实时显示设备信息 概述 上节讲述了通过 Server-Sent Events&#xff08;以下简称 SSE&#xff09; 实现在网页实时更新 ESP32 Web 服务器的传感器数据&#xff0c;并通过表格显示传感器的数据。…

操作系统--中断异常

操作系统第一章易错总结 1.操作系统的功能 ⭐ 编译器是操作系统的上层软件&#xff0c;不是操作系统需要提供的功能。 ⭐注意&#xff1a; 1.批处理的主要缺点是缺乏交互性 2.输入/输出指令需要中断操作&#xff0c;中断必须在核心态下执行 3.多道性是为了提高系统利用率和…