项目七:学会使用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…

Linux 磁盘分区详解以及知识点分解

Linux 磁盘分区 主要命令解释 lsblk&#xff1a;查看磁盘信息&#xff0c;这个命令后面可以直接跟设备名 blkid&#xff1a;查看UUID&#xff08;全局单一标识符&#xff09;和查看文件系统&#xff0c;这个命令后面要跟分区号 fdisk&#xff1a;fdisk命令工具默认将磁盘划分…

实现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…

(SpringBoot)第十二章第一节:Spring事务和@Transactioal

文章目录 一:回顾事务的基本概念(1)事务A:定义B:事务的定义(2)事务的四个特性——ACIDA:数据库的ACID①:原子性(Atomicity)②:一致性(Consistency)③:隔离性(Isolation)④:持续性(Durability)B:破坏ACID的因素二:Spring

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

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

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

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

服务器使用-三丰云

网址&#xff1a;https://www.sanfengyun.com 部署bot使用&#xff1a;三丰云免费云服务器 bot&#xff1a;tx官方bot&#xff0c;使用 python 的 sdk 服务器体验&#xff1a;部署在云服务器上可以长期运行&#xff0c;使用宝塔面板操作方便&#xff0c;流畅&#xff0c;未出…

视频号的7个引流方式

一、账号简介引流 1、获客场景&#xff1a;账号简介相当于一张名片&#xff0c;几乎所有用户进入你的账号后&#xff0c;必然先要看简介 2、优势&#xff1a;相比于抖音、快手等短视频平台&#xff0c;视频号引流私域的路径更短&#xff0c;而且在微信端内有着得天独厚的优势…

Android JNI使用dlopen动态链接库

dlopen 是一个用于在系统中动态加载共享库&#xff08;动态链接库&#xff09;的函数。它的主要作用是在程序运行时动态地加载共享库&#xff0c;使得程序可以在不重新编译的情况下加载并使用库中的函数和变量。 具体来说&#xff0c;dlopen 函数可以接受一个共享库的路径作为…

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…

淘宝交易API,修改交易备注taobao.trade.memo.update

淘宝交易API&#xff0c;修改交易备注taobao.trade.memo.update 需要商家或以上权限才可调用此接口&#xff0c;可重复调用本接口更新交易备注&#xff0c;本接口同时具有添加备注的功能 公共请求参数: 公共请求参数: 名称 类型 必须 描述 method String 是 API接口名…

【论文阅读】Attention is all you need

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

杜牧是唐朝最风流的诗人

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