项目七:学会使用python爬虫解析库(小白大成级)

前期我们学会了怎么使用python爬虫请求库和解析库的简单应用和了解,同时能够对爬虫有一个较为清晰的体系,毕竟简单的爬虫基本上都是请求数据——解析数据——存储数据的大概流程。

那么回忆一下,请求库我们学的是requests模块,解析库学了是正则表达式和re模块。当然我们学习的技术不必拘泥,不必局限也不必自大。

目录

xpath基本介绍

简介

作用

语法规则

lxml基本介绍

简介

安装

作用

用法

案例


这一次我们就来学一下解析库的进阶功法——xpath和python中的lxml库

xpath基本介绍

简介

XPath(XML Path Language)是一种用于在XML和HTML文档中选择节点的查询语言

它被设计用来在这些文档的结构化数据中进行导航和搜索。XPath是W3C的标准,被广泛用于数据提取、配置文件的解析、网页自动化测试以及XML文档的变换和查询。

作用
  1. 数据提取:从XML或HTML文档中提取特定数据。
  2. 自动化测试:在自动化测试框架中定位和操作页面元素。
  3. 配置解析:读取和解析配置文件中的信息。
  4. 文档变换:在XSLT转换中使用XPath选择XML文档中的特定部分进行变换。
语法规则
  1. 节点选择

    • tagname:选择所有指定标签名的元素节点。
    • *:选择所有类型的元素节点。
  2. 上下文路径

    • .:选择当前节点。
    • ..:选择当前节点的父节点。
  3. 绝对路径和相对路径

    • /开头的路径是从文档的根节点开始的绝对路径。
    • 不以/开头的路径是相对路径,基于当前节点的位置。
  4. 轴选择器

    • //:选择当前节点下的所有匹配节点,无论它们的位置。
    • /:从根节点或当前节点(如果是相对路径)开始选择。
  5. 属性选择

    • @attribute:选择具有指定属性的所有元素。
  6. 文本节点和属性值

    • text():选择元素的文本节点。
    • @attribute:选择元素的属性值。
  7. 索引和位置选择

    • [index]:选择轴上位于特定索引位置的节点。
  8. 逻辑和比较运算符

    • =!=<><=>=:用于比较运算。
    • andornot用于逻辑运算。
  9. 通配符

    • *:匹配任意元素名。
    • @*:匹配任意属性名。
  10. 函数

    • XPath提供了多种函数,如count()substring()contains()等,用于更复杂的查询。
  11. 谓语表达式

    • [predicate]:在方括号内使用谓语来进一步筛选节点。

XPath的强大之处在于其能够表达复杂的规则来匹配文档中的特定节点,这使得它成为处理XML和HTML文档的强大工具。

在了解xpath的语法规则之后,我们再来看一下python中的lxml库

lxml基本介绍

简介

lxml 是 Python 中一个非常强大的库,用于处理 XML 和 HTML 文档。它提供了高效且易于使用的 API,支持 XML 元素的解析、创建、修改和删除

lxml 库基于 C 语言实现的 libxml2 和 libxslt 库,因此比纯 Python 实现的 XML 处理库有更好的性能。

安装
pip install lxml

安装完成后,你可以通过在 Python 解释器中输入以下命令来检查 lxml 是否已正确安装:

import lxml
print(lxml.__version__)

这应该会打印出 lxml 的版本号,表明它已经安装成功。

如果在安装过程中遇到任何问题,确保你的 pip 是最新版本,可以通过运行 pip install --upgrade pip 来更新它。

作用
  1. 解析 XML/HTML:快速解析 XML 和 HTML 文档。
  2. 元素操作:创建、修改和删除 XML/HTML 文档中的元素。
  3. XPath 支持:使用 XPath 表达式查询和选择文档中的元素。
  4. 转换:支持 XSLT 转换,可以用于文档的转换和模板生成。
  5. 输出:将 XML/HTML 树转换为字符串,包括格式化输出。
  6. 错误处理:提供对解析错误的处理和诊断。
用法
  • 解析文档

    from lxml import etree# 解析 XML 字符串
    xml_string = "<root><child>Content</child></root>"
    root = etree.XML(xml_string)# 解析 HTML 字符串
    html_string = "<html><body><p>Hello World!</p></body></html>"
    root = etree.HTML(html_string)

    解释:这部分代码演示了如何使用etree.HTML来解析HTML字符串。它将html_string传递给etree.HTML方法,同样返回一个表示HTML结构的对象root

    总而言之,这段代码展示了lxml库中etree模块用于解析XML和HTML字符串的基本用法。

  • 使用 XPath

    # 使用 XPath 查找元素elements = root.xpath('//child')

    解释:这行代码使用XPath表达式'//child'在解析后的XML或HTML文档中查找所有名为"child"的元素。具体来说,'//'表示从根节点开始搜索,而'child'表示要查找名为"child"的元素。

    elements将包含所有匹配的元素,它们可以进一步被操作和处理。

    总之,这行代码演示了如何使用XPath表达式在解析后的文档中查找元素。

  • 修改和添加元素

    # 修改元素文本
    for elem in elements:elem.text = 'New Content'# 添加新元素
    new_elem = etree.SubElement(root, 'newChild')
    new_elem.text = 'This is a new child'

    解释:这部分代码创建了一个名为'newChild'的新元素,并将其文本内容设置为'This is a new child',然后将其添加到根元素中。

    这些操作展示了如何使用lxml库中etree模块对解析后的文档进行元素文本的修改以及添加新元素。

    综上所述,这段代码演示了如何对解析后的XML或HTML文档进行修改操作。

  • 保存文档

    # 将 XML/HTML 树保存到文件
    with open('output.xml', 'wb') as f:f.write(etree.tostring(root, pretty_print=True))

    解释:此代码段使用Python的open()方法来打开一个名为'output.xml'的文件,并以二进制模式 ('wb') 进行写操作。然后,使用etree.tostring()方法将XML或HTML树转换为字节流,并将其写入到打开的文件中。参数pretty_print=True用于指定是否在输出的XML中包含格式化空白以提高可读性。

    这段代码将解析后的XML或HTML文档以XML格式保存到名为'output.xml'的文件中。

    总体来说,这段代码展示了如何使用lxml库中的etree模块将XML或HTML树保存到文件中。

案例

解析 HTML 并提取链接

from lxml import etreehtml = """
<html><body><a href="https://example.com">Example</a><a href="https://lxml.de">lxml</a></body>
</html>
"""# 解析 HTML
tree = etree.HTML(html)# 使用 XPath 提取所有链接的 href 属性
links = tree.xpath('//a/@href')for link in links:print(link)

代码解释

这段代码演示了如何使用lxml库中etree模块解析HTML,并使用XPath提取所有链接的href属性并打印出来。

这行代码导入了lxml库中的etree模块,以便后续使用其提供的功能。

from lxml import etree

接下来,这个代码包含了一个多行的HTML字符串。

html = """
<html><body><a href="https://example.com">Example</a><a href="https://lxml.de">lxml</a></body>
</html>
"""

然后,代码使用etree.HTML()方法解析了HTML字符串,得到了一个表示HTML结构的树。

tree = etree.HTML(html)

这个代码使用XPath表达式'//a/@href'在解析后的HTML树中提取所有<a>元素的href属性。然后通过for循环打印出每个链接的href属性值。

links = tree.xpath('//a/@href')for link in links:print(link)

综上所述,这段代码演示了如何使用lxml库中的etree模块解析HTML,并使用XPath提取链接的href属性并打印出来。

输出结果

可以看到这个控制台中输出两个链接,表明成功提取到目标链接,这个以后我们会经常用到了

创建新的 XML 文档

from lxml import etree# 创建根元素
root = etree.Element('root')# 创建子元素并添加到根元素
child = etree.SubElement(root, 'child')
child.text = 'This is a child element'# 添加属性到子元素
child.set('attr', 'value')# 将 XML 树转换为字符串并打印
print(etree.tostring(root, pretty_print=True).decode())

代码解释

这段代码演示了如何使用lxml库中etree模块创建XML树添加子元素以及子元素的属性,并将XML树转换为字符串后打印出来。

这行代码导入了lxml库中的etree模块,以便后续使用其提供的功能。

from lxml import etree

这部分代码创建了一个名为'root'的根元素。

root = etree.Element('root')

这段代码创建了一个名为'child'的子元素,并将其文本内容设置为'This is a child element',然后将它添加到根元素中。

child = etree.SubElement(root, 'child')
child.text = 'This is a child element'

这行代码向子元素添加了一个名为'attr'的属性,其值为'value'。

child.set('attr', 'value')

最后,这行代码将XML树转换为字符串,并使用print()函数打印出来。etree.tostring()方法将XML树转换为字节流,参数pretty_print=True用于指定是否在输出的XML中包含格式化空白以提高可读性。.decode()将字节流转换为字符串后进行打印。

print(etree.tostring(root, pretty_print=True).decode())

综上所述,这段代码演示了如何使用lxml库中的etree模块创建XML树、添加子元素及属性,并将XML树转换为字符串后打印出来。

输出结果

可以看到控制台输出的结果是简单的xml树结构,以及子元素具有属性和文本内容的情况。

ok,这一次我们爬虫已经经历过入门级、小成级到大成级,最后我们将要达到爬虫基础的圆满级,相信你一定对基础级的爬虫有个明确的使用的方法和知识体系。

今日心得、到此一游,我是好运,想要好运,期待你的肯定和鼓励

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

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

相关文章

项目管理-项目开发计划介绍

目录 一、内容总览 二、项目开发计划概述 2.1 概述 2.2 项自开发计划的目的和作用 2.3 项目开发计划的内容 2.3.1 工作计划 2.3.2 人员组织计划 2.3.3 设备采购和资源供应计划 2.3.4 配置管理计划 2.3.5 进度安排计划 2.3.6 成本投资计划 2.3.7 质量保证计划 2.3.8…

实现I.MX6ULL开发板与Windows和Ubuntu系统之间的通信

虚拟机与主机之间的连接方式确实包括桥接模式、NAT模式和仅主机模式。 桥接模式&#xff08;Bridged&#xff09;&#xff1a;在桥接模式下&#xff0c;虚拟机通过虚拟交换机直接连接到主机的物理网络上&#xff0c;就像一台独立的物理机器一样&#xff0c;拥有自己的IP地址&a…

[阅读笔记23][JAM]JOINTLY TRAINING LARGE AUTOREGRESSIVE MULTIMODAL MODELS

这篇论文是24年1月发表的&#xff0c;然后是基于的RA-CM3和CM3Leon这两篇论文。它所提出的JAM结构系统地融合了现有的文本模型和图像生成模型。 主要有两点贡献&#xff0c;第一点是提出了融合两个模型的方法&#xff0c;第二点是为混合模型精心设计的指令微调策略。 下图是一个…

Unity射击游戏开发教程:(1)玩家控制

玩家的移动 玩家控制和移动是视频游戏中最酷的事情之一,因为你正在控制游戏中的某些东西 现在游戏中的玩家是我们的蓝色方块英雄。我在游戏开发中了解到,游戏是用简单的对象制作原型,然后添加所有漂亮的艺术和声音。代码… 我们要做的第一件事是在游戏开始时为玩家提供一个…

MATLAB 体素滤波(62)

MATLAB 体素滤波(62) 一、算法介绍二、算法实现1.代码(已验证,直接运行)一、算法介绍 这里的代码完成文件读入,体素滤波,效果显示,结果输出的操作,下面是效果截图,后面是代码。 体素滤波(Voxel Filtering)是一种用于三维点云数据处理的方法,其原理类似于二维图像…

力扣HOT100 - 142. 环形链表 II

解题思路&#xff1a; public class Solution {public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();while (head ! null) {if (!set.add(head)) {return head;}head head.next;}return null;} }

广西建筑模版厂家批发供应,当天发货全国可达

近年来&#xff0c;建筑行业蓬勃发展&#xff0c;对高质量的建筑模板需求量逐渐增加。在这个竞争激烈的市场中&#xff0c;贵港市能强优品木业有限公司以其出色的产品和卓越的服务迅速崭露头角&#xff0c;成为知名的建筑模板生产厂家。 作为一家拥有25年生产经验的公司&#x…

用FRP配置toml文件搭建内网穿透

需求场景 1、一台外网可访问的有固定ip的云服务器&#xff0c;Ubuntu系统 2、一台外网无法访问的无固定ip的本地家用电脑&#xff0c;Ubuntu系统 需求&#xff1a;将云服务器搭建为一台内网穿透服务器&#xff0c;实现通过外网访问家用电脑&#xff08;网页&#xff09;的功能。…

人工智能|机器学习——基于机器学习的信用卡办卡意愿模型预测项目

一、背景介绍 在金融领域&#xff0c;了解客户的信用卡办卡意愿对于银行和金融机构至关重要。借助机器学习技术&#xff0c;我们可以根据客户的历史数据和行为模式预测其是否有办理信用卡的倾向。本项目通过Python中的机器学习库&#xff0c;构建了两个常用的分类模型&#xff…

Ardupilot无人船(车)自动调参

无人船&#xff08;车&#xff09;快速调参脚本简化了为无人船&#xff08;车&#xff09;角速率和速度控制器调参的过程。 该脚本应该在无人船&#xff08;车&#xff09;在Circle模式下循环绕圈时运行。它记录转向和油门输出以及由此产生的响应(例如无人船&#xff08;车&am…

高精度算法(2)

前言 延续上次所讲的内容再对乘法和除法进行说明&#xff0c;希望有所帮助 注意这里的乘除法都是针对于整数如果要是涉及到小数&#xff0c;我们得使用二分法 通过二分同样可以解决小数精度问题 高精度乘法 思路 我们只能用字符串来读取一个很大很大的数&#xff0c;所以…

阿赵UE学习笔记——28、粒子系统Niagara简介

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用。这次开始学习粒子系统的使用。 一、Cascade系统 在介绍UE5的Niagara系统之前&#xff0c;必须先介绍一下旧版本的粒子系统。   在UE4的时候&#xff0c;虚幻引擎的粒子系统叫做Cascade&#x…

【论文阅读】Attention is all you need

摘要 主要的序列转换模型是基于复杂的循环或卷积神经网络&#xff0c;其中包括一个编码器和一个解码器。性能最好的模型还通过一种注意力机制将编码器和解码器连接起来。我们提出了一种新的简单的网络架构&#xff0c;Transformer&#xff0c;完全基于注意机制&#xff0c;完全…

杜牧是唐朝最风流的诗人

杜牧&#xff0c;有“杜紫薇”之称&#xff0c;是宰相杜佑的孙子。李白、杜甫是“大李杜”。杜牧、李商隐是“小李杜”。 杜牧23岁写了《阿房宫赋》&#xff0c;一朝成名天下知。 唐朝晚年&#xff0c;科举和仕途没有出路&#xff0c;杜牧寄情享乐。杜牧怀才不遇&#xff0c;…

C语言--函数递归

目录 1、什么是递归&#xff1f; 1.1 递归的思想 1.2 递归的限制条件 2. 递归举例 2.1 举例1&#xff1a;求n的阶乘 2.2 举例2&#xff1a;顺序打印⼀个整数的每⼀位 3. 递归与迭代 扩展学习&#xff1a; 早上好&#xff0c;下午好&#xff0c;晚上好 1、什么是递归&…

Ubuntu 22.04.4安装Docker引擎

正文共&#xff1a;1024 字 13 图&#xff0c;预估阅读时间&#xff1a;1 分钟 我们前面安装了几次Ubuntu的操作系统&#xff08;Ubuntu 23.10通过APT安装Open vSwitch&#xff09;&#xff0c;在开始之前&#xff0c;我还是简单提醒一下&#xff0c;从Ubuntu下载页面&#xff…

因式分解技巧1-----一次提净

什么是因式分解&#xff1f; 在小学&#xff0c;我们都学过质因数分解。就比如&#xff1a;&#xff0c;然而我们可以发现&#xff01;4此时还没有被分解完&#xff0c;于是&#xff1a; 则&#xff1a; 这是小学的质因数分解。那么我们一起看看初中的因式分解。 例1&…

SpringBoot3 函数式web 小记

前言&#xff1a;函数式web是spring5.2之后的一个新特性&#xff0c;Spring Boot 3 进一步优化了这一模型&#xff0c;为开发现代 Web 应用提供了更加灵活、简洁的方法&#xff1b; 函数式web的四大核心对象 - RouterFunction&#xff1a;定义路由信息 - RequestPredicates&am…

深度解析 Spring 源码:三级缓存机制探究

文章目录 一、 三级缓存的概述二、 三级缓存的实现原理2.1 创建Bean流程图2.2 getBean()2.3 doGetBean()2.4 createBean()2.5 doCreateBean()2.4 getSingleton() 三、 三级缓存的使用场景与注意事项3.1 在实际开发中如何使用三级缓存3.2 三级缓存可能出现的问题及解决方法 一、…