python中lxml库的使用简介

news2024/10/6 10:29:46
  

目录

1.ElementTree 类

2.Element 类

3.ElementTree 类或 Element 类的查找方法


      为方便开发人员在程序中使用 XPath 的路径表达式提取节点对应的内容, Python 提供了
第三方库 lxml 。开发人员通过 lxml 库可以轻松地对 HTML XML 文档中的目标节点进行定
位并提取。这里以 4.6.3 版本的 lxml 库为例进行介绍。
        在 lxml 库中,大多数有关解析网页数据的功能都封装到 etree 模块中, etree 模块包含了
两个比较重要的类,它们分别是 ElementTree 类和 Element 类,关于这两个类的相关内容的介
绍如下。

1.ElementTree 类

        ElementTree 类的对象可以理解为一个 HTML XML 文档的节点树。为方便开发者将
HTML XML 文档转换为 ElementTree 类的对象, etree 模块中提供了一个 parse() 函数。 parse()
函数的声明如下。
parse(source, parser=None, base_url=None)
上述函数中各参数的含义如下。
  •  source:必选参数,表示待解析的内容,该参数共支持 4 种类型的取值,它们分别是
打开的文件对象(确保以二进制模式打开)、类似文件的对象、字符串形式的文件名称、字符
串形式的 URL
  • parser:可选参数,表示解析器。若未指定解析器,则会使用默认的解析器;若希望
指定其他解析器,则可以通过 help(etree.XMLParser) 查看 lxml 支持的解析器。
  • base_url:可选参数,表示基础 URL
下面以 4.3.2 节中的 bookstore.xml 为例,演示如何根据该文档使用 parse() 函数创建
ElementTree 类的对象,示例代码如下。
from lxml import etree 
# 根据 bookstore.xml 文件创建 ElementTree 类的对象
ele_tree = etree.parse(r'bookstore.xml') 
print(type(ele_tree))
运行代码,输出如下结果。
<class 'lxml.etree._ElementTree'>
        此外,etree 模块还提供了 fromstring() 函数、 XML() 函数和 HTML() 函数。这 3 个函数也
可以解析 HTML XML 文档或片段,只不过在解析成功后返回根节点或者解析器目标返回
的结果。其中, fromstring() 函数和 XML() 函数具有相同的功能,都可以从字符串常量中解析
XML 文档或片段; HTML() 函数用于从字符串常量中解析 HTML 文档或片段,并能够自动补
全文档或片段中缺少的 <html> <body> 元素。
        例如,使用 fromstring() 函数解析 XML 片段,具体代码如下。
from lxml import etree 
xml_doc = ''' 
<bookstore> 
 <book> 
 <title lang="eng">Harry Potter</title> 
 <price>29.99</price> 
 </book> 
 <book> 
 <title lang="eng">Learning XML</title> 
 <price>39.95</price> 
 </book> 
</bookstore> 
''' 
# 从字符串 xml_doc 中解析 XML 片段
root_node = etree.fromstring(xml_doc) 
print(root_node)
运行代码,输出如下结果。
<Element bookstore at 0x33d7a00>
从输出结果可以看出,程序输出了一个 Element 类的对象,该对象是根节点 bookstore

2.Element 类

        Element 类的对象可以理解为 XML HTML 文档的节点。它与 Python 中的列表非常相
似,可以使用诸如 len() 方法、 append() 方法、 remove() 方法修改节点,也可以使用索引、切片
获取节点集中的子节点。
例如,使用索引或切片获取 root_node 对象中的子节点,具体代码如下。
print(root_node[:]) # 获取所有的子节点
print(root_node[0]) # 获取第 1 个子节点
print(root_node[1]) # 获取第 2 个子节点

运行代码,输出如下结果。

[<Element book at 0x34cae00>, <Element book at 0x34cae80>]
<Element book at 0x34cae00>
<Element book at 0x34cae00>

除此之外,Element 类还提供了一些获取节点的属性,关于这些属性及其说明如表 4-6 所示。

 

例如,获取 root_node 对象的名称,示例代码如下。

print(root_node.tag)

运行代码,输出如下结果。 

bookstore

3.ElementTree 类或 Element 类的查找方法

        ElementTree类或 Element 类中提供了 3 个常用的查找方法,它们分别是 find() 方法、 findall()
方法和 xpath() 方法。关于 find() 方法、 findall() 方法和 xpath() 方法的介绍如下。
find() 方法:从节点树的某个节点开始查找,返回匹配到的第一个子节点。
findall() 方法:从节点树的某个节点开始查找,以列表的形式返回匹配到的所有子节点。
xpath() 方法:从节点树的根节点或某个节点开始查找,以列表的形式返回匹配到的所
有子节点。
        使用上述 3 个方法都可以接收 XPath 的路径表达式,并在调用成功后返回查找到的最终
结果,不过, find() 方法和 findall() 方法只支持相对路径, xpath() 方法支持相对路径和绝对路径。
需要注意的是,若 find() 方法未找到匹配项,则会返回 None ;若 findall() 方法和 xpath() 方法未
找到匹配项,则会返回一个空列表。
        以 root_node 对象为例,分别使用以上 3 个方法查找第一个 price 节点的文本,示例代码
如下。
res1 = root_node.find('.//price').text
print(res1)
res2 = root_node.findall('.//price')[0].text
print(res2)
res3 = root_node.xpath('.//price')[0].text
print(res3)

运行代码,输出如下结果。

29.99
29.99
29.99

 

 

 

 

 

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

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

相关文章

25考研:今年初试时间比去年更早了?

过去5年考研初试时间安排如下&#xff1a; 24考研&#xff1a;2023年12月23-24日&#xff08;倒数第二个周末&#xff09; 23考研&#xff1a;2022年12月24-25日&#xff08;倒数第二个周末&#xff09; 22考研&#xff1a;2021年12月25-26日&#xff08;最后一个周末&#xf…

JVM原理(四):JVM垃圾收集算法与分代收集理论

从如何判定消亡的角度出发&#xff0c;垃圾收集算法可以划分为“引用计数式垃圾收集”和“追踪式垃圾收集”两大类。 本文主要介绍的是追踪式垃圾收集。 1. 分代收集理论 当代垃圾收集器大多遵循“分代收集”的理论进行设计&#xff0c;它建立在两个假说之上&#xff1a; 弱分…

宇宙第一大厂亚马逊云科技AWS人工智能/机器学习证书即将上线,一篇文章教你轻松拿下

据麦肯锡《在华企业如何填补AI人才缺口》研究表明&#xff0c;到2030年人工智能为中国带来的潜在价值有望超过1万亿美元&#xff0c;而随着各大企业进入人工智能化&#xff0c;对该领域的人才需求将从目前的100万增长到2030年的600万。然而到保守估计&#xff0c;到2030可以满足…

DP(动态规划)【3】 最长公共子序列 最长回文子串

目录 1.最长公共子序列 状态转移方程需要二维数组&#xff0c;1-dim已经不太够了 又是这个问题&#xff1a;如何读入字符串 2.最长回文子串 1.最长公共子序列 状态转移方程需要二维数组&#xff0c;1-dim已经不太够了 这里dp[i][j]是说S的前i位与T的前j位公共序列&#xff…

数据库期末,一篇就够了!【全面】【期末考试】

1. 数据库系统概论 数据库3个特点&#xff1a;永久存储&#xff0c;有组织&#xff0c;可共享 数据库管理技术&#xff1a; 人工管理&#xff1a;无专门的软件&#xff0c;数据不共享&#xff0c;程序与数据不具有独立性 文件系统管理&#xff1a;有专门用于管理数据的应用软…

【python - 数据】

一、序列 序列&#xff08;sequence&#xff09;是一组有顺序的值的集合&#xff0c;是计算机科学中的一个强大且基本的抽象概念。序列并不是特定内置类型或抽象数据表示的实例&#xff0c;而是一个包含不同类型数据间共享行为的集合。也就是说&#xff0c;序列有很多种类&…

345亿!博世这次瞄上另一家制造业巨头了,打不过就买下它~

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 汽车零部件巨头博世近日传出收购风声&#xff0c;其目标直指美国家电制造巨头惠而浦。尽管尚未有确切消息证实收购要约的提出&#xff0c;但这一…

OFDM技术简介——背景

l 1966 年&#xff0c; R. W. Chang 提出在带限信道中用 正交信号 同时传输 多路数据 的原理&#xff0c;同时这种传输方式保证系统中不存在符号间串扰和子信道间干扰&#xff0c;该技术可以有效提高频谱利用率&#xff0c;可以有效对抗信道多径衰落。 l 1971 年&#xff0c; …

LLM应用开发-RAG系统评估与优化

前言 Hello&#xff0c;大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者&#xff0c;在上一篇文章中&#xff0c;我们学习了如何基于LangChain构建RAG应用&#xff0c;并且通过Streamlit将这个RAG应用部署到了阿里云服务器&#xff1b;&am…

【Qt知识】Geometry属性

一、走进Geometry的世界 Geometry属性是Qt框架中用于处理和操作几何形状的一系列类的集合。它包括了QPoint、QPointF、QSize、QSizeF、QRect和QRectF等。这些类分别代表点、大小、矩形等基本几何概念&#xff0c;它们的存在让图形界面的创建变得既简单又直观。 位置和尺寸。 其…

DCS-11双位置继电器 DC220V 板前接线带底座 约瑟 JOSEF

系列型号&#xff1a; DCS-11双位置继电器&#xff1b; DCS-12双位置继电器&#xff1b; DCS-13双位置继电器&#xff1b; ​用途 RXMVB2(DCS-10)系列双位置继电器用于需要大容量双稳态触点的工业控制和其它一般控制场合。 特点 体积小&#xff0c;拆装方便&#xff0c;能安…

phpMyAdmin | mysqli::real_connect(): (HY000/2002): No such file or directory

法一&#xff1a;第一次安装宝塔 第一次安装宝塔mysql服务是默认关闭的&#xff0c;需要手动打开&#xff0c;打开服务再次进入phpMyAdmin发现可以进入了 法二&#xff1a;第一种方法没解决用这种 出现mysqli::real_connect(): (HY000/2002): No such file or directory错误通…

java spring 拦截器和过滤器+过滤器处理数据

java spring 拦截器和过滤器过滤器处理数据 介绍Spring拦截器&#xff08;Interceptor&#xff09;导入依赖完整代码 Java过滤器&#xff08;Filter&#xff09;完整代码分为 2 个文件&#xff0c;请看下面BodyReaderHttpServletRequestWrapper.javaMyFilter.java Spring过滤器…

昇思25天学习打卡营第6天|linchenfengxue

​​​​​​SSD目标检测 SSD&#xff0c;全称Single Shot MultiBox Detector&#xff0c;是Wei Liu在ECCV 2016上提出的一种目标检测算法。使用Nvidia Titan X在VOC 2007测试集上&#xff0c;SSD对于输入尺寸300x300的网络&#xff0c;达到74.3%mAP(mean Average Precision)以…

网络编程常见问题

1、TCP状态迁移图 2、TCP三次握手过程 2.1、握手流程 1、TCP服务器进程先创建传输控制块TCB&#xff0c;时刻准备接受客户进程的连接请求&#xff0c;此时服务器就进入了LISTEN&#xff08;监听&#xff09;状态&#xff1b; 2、TCP客户进程也是先创建传输控制块TCB&#xff…

操作系统期末复习考题三(不挂科系列)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文☀️☀️☀️三、总结&#x1f353;&#x1f353;&#x1f353; 一、前言&#x1f680;&#x1f680;&am…

【操作系统期末速成】 EP03 | 学习笔记(基于五道口一只鸭)

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文&#xff1a;☀️☀️☀️2.1 考点五&#xff1a;进程的概念及特征2.1 考点六&#xff1a;进程的状态与切换 一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 回报不在行动之后&#xff0c;回报在行动…

isalnum()方法——判断字符串是否由字母和数字组成

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 isalnum()方法用于判断字符串是否由字母和数字组成。isalnum()方法的语法格式如下&#xff1a; str.isalnum() 如果字符串中至少有一个字…

install nebula with source

linux 环境&#xff1a;ubuntu 2004 默认gcc 7.5 nebula requerment&#xff1a; g 8.5 above 下载source git clone --branch release-3.8 https://github.com/vesoft-inc/nebula.git install gcc g 11 apt install gcc-11 g-11 此时 linux环境存在多个版本gcc&#xff1a…

运算放大器(运放)带宽和带宽平坦度

运算放大器带宽和带宽平坦度 电压反馈型运算放大器的带宽 下图1显示电压反馈型运算放大器的开环频率响应。有两种可能&#xff1a;图1A是最常见的情况&#xff0c;高直流增益以6dB/倍频程从极低频率下降至单位增益&#xff0c;也就是典型的单极点响应。相比之下&#xff0c;图…