Python 中的 Lxml 库与 XPath 用法

Python 中的 Lxml 库与 XPath 用法

    • Python 中的 Lxml 库与 XPath 用法
      • Lxml
        • 安装 Lxml
        • 基础用法
          • 加载文档
          • 解析与查询
          • 创建新的 XML/HTML
        • 高级特性
          • 1. 复杂的 XPath 查询
          • 2. DTD 和 Schema 验证
          • 3. XSLT 变换
          • 4. 自定义命名空间
          • 5. 异常处理
          • 6. 大文件流式处理
          • 7. 并发和线程安全性
          • 8. 性能优化
      • XPath
        • 基础 XPath 语法
          • 选择元素
          • 谓词
        • 复杂查询
          • 组合条件
          • 函数
          • 节点数量
          • 排序
        • 实例演示
        • 性能注意事项
      • Lxml 和 XPath 的示例

Python 中的 Lxml 库与 XPath 用法

Lxml 是一个 Python 的第三方库,它提供了一套非常强大且高效的工具,用于处理 HTML 和 XML 文档。Lxml 结合了 libxml2 和 libxslt 库的功能,这意味着它不仅速度快,而且功能全面。对于 Web 抓取、文档解析和转换等工作,Lxml 是一个极佳的选择。

Lxml

安装 Lxml

可以通过 pip 来安装 Lxml:

pip install lxml
基础用法

Lxml 提供两种主要的数据结构: ElementTreeElementElementTree 表示整个文档,而 Element 则代表单个节点。

加载文档

你可以加载本地文件或者字符串形式的 HTML/XML 内容。

from lxml import etree# 从文件加载
tree = etree.parse('example.xml')# 从字符串加载
html_str = "<html><body><h1>Hello World!</h1></body></html>"
root = etree.fromstring(html_str)
解析与查询

使用 XPath 查询语法可以轻松提取信息。

# 获取所有 h1 元素
elements = tree.xpath('//h1')# 输出元素文本
for elem in elements:print(elem.text)
创建新的 XML/HTML

Lxml 支持创建全新的 XML 或者 HTML 文件。

# 创建新元素
elem = etree.Element("greeting")
elem.text = "Hello"
sub_elem = etree.SubElement(elem, "name")
sub_elem.text = "World"# 将元素转化为字符串输出
etree.tostring(elem, pretty_print=True)
高级特性

Lxml 是一个极其丰富的库,为处理 XML 和 HTML 提供了大量的高级功能。以下是 Lxml 提供的一些关键特性和使用案例,这些特性让它成为一个非常强大且多功能的工具包:

1. 复杂的 XPath 查询

除了基本的 XPath 功能外,Lxml 还支持更复杂的 XPath 2.0 特性,比如:

  • 函数调用,如 substring, starts-with, normalize-space
  • 更多的数据类型处理,如日期时间处理
  • 数组和序列的操作
from lxml import etree# 检查是否以特定字符开头
results = tree.xpath("//element[starts-with(@attr, 'prefix')]")# 字符串截取
value = tree.xpath("string(/path/to/node)[substring(., 1, 5)]")# 正则表达式匹配
matches = tree.xpath("//element[re:test(@attr, 'pattern')]")
2. DTD 和 Schema 验证

Lxml 提供了 DTD(Document Type Definition)和 Schema(如 XML Schema, Relax NG)的验证功能,确保你的文档符合预定的标准。

# 创建一个 DTD 或 Schema 验证器
schema = etree.DTD('my.dtd')
schema = etree.XMLSchema(etree.parse('myschema.xsd'))# 验证文档
if not schema.validate(tree):raise ValueError("Document is not valid against the provided DTD or Schema.")
3. XSLT 变换

Lxml 支持使用 XSLT 对 XML 文档进行转换,这是一种将源 XML 转换成另一种格式的有效方式。

# 加载 XSLT 文件
transformer = etree.XSLT(etree.parse('stylesheet.xsl'))# 应用转换
new_doc = transformer(etree.parse('source.xml'))
4. 自定义命名空间

在处理带有命名空间的 XML 文档时,Lxml 提供了简洁的方式来进行处理。

ns = {'n': 'http://www.example.com/mynamespace'}# 使用命名空间查询
elements = tree.xpath('//n:element', namespaces=ns)
5. 异常处理

Lxml 包含了丰富的异常类,可以让你更准确地捕捉和处理 XML/HTML 解析过程中的问题。

from lxml.etree import ParseErrortry:doc = etree.fromstring('<bad_xml>')
except ParseError as e:print(f"Parse error at line {e.lineno}: {e.message}")
6. 大文件流式处理

对于大型文件,Lxml 提供了流式处理功能,避免一次性加载整个文档到内存。

context = etree.iterparse('largefile.xml', events=('end',), huge_tree=True)
for event, elem in context:# 这里可以安全地处理每个元素process_element(elem)elem.clear()while elem.getprevious() is not None:del elem.getparent()[0]del context
7. 并发和线程安全性

Lxml 在设计上考虑了线程安全,并允许你在多线程环境中使用,这对于大规模数据处理特别有用。

8. 性能优化

Lxml 由 C 实现,在速度和资源管理方面进行了优化,尤其是当与其他纯 Python 解析器比较时更为明显。你还可以通过设置解析器选项来自定义解析行为。

parser = etree.XMLParser(remove_comments=True, recover=True)
tree = etree.parse('large_file.xml', parser=parser)

总之,Lxml 是 Python 生态系统中处理 XML 和 HTML 数据的一个强大库,无论是用于解析、生成、验证还是变换,它都表现出色。通过上述基础和进阶应用的学习,你应该能够灵活运用 Lxml 来解决复杂的数据处理任务。

XPath

XPath 是一种在 XML 文档中查询和定位元素和属性的强大语言,但它同样可以应用于 HTML 文档。XPath 的表达式可以相当复杂,涵盖了广泛的查询需求。下面是 XPath 的一些常用操作和高级用法汇总:

基础 XPath 语法
选择元素
  • //:从根节点开始搜索所有子孙节点
  • /:绝对路径
  • .:当前节点
  • ..:父节点
  • *:任何元素
  • @:属性选择器
  • ancestor:祖先节点
  • attribute:属性
  • child:子节点
  • descendant:后代节点
  • following-sibling:后续同级节点
  • preceding-sibling:前面的同级节点
谓词
  • [1]:选择指定位置的节点
  • [contains(text(), 'search-text')]:包含文本的节点
  • [@class='classname']:具有特定属性的节点
复杂查询
组合条件
  • and / or:逻辑运算符连接多个条件
  • not():否定条件
函数
  • string-length():计算字符串长度
  • normalize-space():移除首尾空格,压缩内部空白
  • concat():拼接字符串
  • contains(string, substring):检查子字符串
  • starts-with(string, prefix):检查字符串前缀
  • ends-with(string, suffix):检查字符串后缀
节点数量
  • count(node-set):统计节点数目
排序
  • sort():按顺序排列结果
实例演示

假设有一个 XML 文档如下:

<books><book genre="fiction"><author>John Doe</author><title>The Great Novel</title><year>2020</year></book><book genre="non-fiction"><author>Jane Smith</author><title>A Guide to Cooking</title><year>2019</year></book>
</books>

选择所有书名

//book/title

选择第一本书的作者

/book[1]/author

找到年份大于等于 2020 的所有书

//book[year >= 2020]

查找标题包含 “Guide” 的书

//book[contains(title, 'Guide')]

获取具有非小说类型的书的作者名字

//book[@genre != 'fiction']/author

按出版年份降序排序的书籍列表

//book | sort-by(., year descending)
性能注意事项

虽然 XPath 非常强大,但在处理大数据量时,应该谨慎使用,因为某些查询可能涉及遍历大量节点,从而影响性能。为了提高效率,尽量减少重复扫描,使用索引或其他技术,特别是在大型文档中进行搜索时。

总之,XPath 提供了一个功能丰富且直观的方式来操纵和查询 XML 和 HTML 文档。掌握这些基本和高级用法可以使你更加熟练地处理各种结构化文档的分析和检索工作。

Lxml 和 XPath 的示例

from lxml import etreexml_data = """
<books><book genre="fantasy"><author>Tolkien</author><title>The Hobbit</title><year>1937</year></book><book genre="science-fiction"><author>Asimov</author><title>I, Robot</title><year>1950</year></book><book genre="horror"><author>King</author><title>The Shining</title><year>1977</year></book>
</books>
"""# 解析 XML 字符串
root = etree.fromstring(xml_data)

现在我们可以编写一系列示例,对应不同的 XPath 查询:

  1. 选择所有 <title> 元素
titles = root.xpath('//title')
for t in titles:print(t.text)
  1. 获取第一本书的 <year>
first_year = root.xpath('//book/year')[0].text
print(first_year)
  1. 找到类型为科幻的书
sci_fi_books = root.xpath('//book[@genre="science-fiction"]')
for book in sci_fi_books:print(book.find('title').text)
  1. 查找标题包含单词 “The” 的所有书
the_books = root.xpath('//book[title[translate(text(),"THE","the") = "the"]]')
for book in the_books:print(book.find('title').text)

注意上面使用 translate() 函数将标题转换成小写以便不区分大小写的比较。

  1. 选择最新的一本书
latest_book = root.xpath('//book[last()]')
print(latest_book[0].find('title').text)
  1. 按照年份升序排序书籍
sorted_books = sorted(root.findall('.//book'), key=lambda b: int(b.find('year').text))
for book in sorted_books:print(book.find('title').text)
  1. 获取所有书籍的作者和标题
authors_and_titles = root.xpath('//book/(author|title)')
for i in range(0, len(authors_and_titles), 2):author = authors_and_titles[i].texttitle = authors_and_titles[i+1].textprint(f"{author} wrote {title}")
  1. 获取书籍总数
total_books = len(root.xpath('//book'))
print(total_books)

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

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

相关文章

共享售卖机语音芯片方案选型:WTN6020引领智能化交互新风尚

在共享经济蓬勃发展的今天&#xff0c;共享售卖机作为便捷购物的新形式&#xff0c;正逐步渗透到人们生活的各个角落。为了提升用户体验&#xff0c;增强设备的智能化和互动性&#xff0c;增加共享售卖机的语音功能就显得尤为重要。 共享售卖机语音方案选型&#xff1a; WTN602…

关闭AWS账号后,服务是否仍会继续运行?

在使用亚马逊网络服务&#xff08;AWS&#xff09;时&#xff0c;用户有时可能会考虑关闭自己的AWS账户。这可能是因为项目结束、费用过高&#xff0c;或是转向使用其他云服务平台。然而&#xff0c;许多人对关闭账户后的服务状态感到困惑&#xff0c;我们九河云和大家一起探讨…

新版本PasteSpider开发中专用部署工具介绍(让2GB的服务器也能使用CI/CD,简化你的部署过程)

如果你有linux服务器&#xff0c;可以试试这个PasteSpider&#xff0c;利用容器管理软件(docker/podman)&#xff0c;可以快速上手&#xff01; 拉取镜像并安装 【【【PasteSpider的下载和安装(支持docker的一键模式)】】】 建议使用 最简单的模式SqliteMemoryCache 测试嘛…

【小白学机器学习37】用numpy计算协方差cov(x,y) 和 皮尔逊相关系数 r(x,y)

目录 1 关于1个数组np.array&#xff08;1组数据&#xff09;如何求各种统计数据 2 关于2个数组np.array&#xff08;2组数据&#xff09;如何求数组的相关关系&#xff1f; 2.1 协方差公式和方差公式 2.2 协方差 公式 的相关说明 2.3 用np.cov(x,y,ddof0) 直接求协方差矩…

C++ 11重点总结1

智能指针 智能指针: C11引入了四种智能指针: auto_ptr(已弃用)、unique_ptr、shared_ptr和weak_ptr。智能指针可以更有效地管理堆内存,并避免常见的内存泄漏问题。 shared_ptr: 自定义删除器。 shared_ptr使用引用计数来管理它指向的对象的生命周期。多个shared_ptr实例可以指向…

2024年nvm保姆级安装教程

需求&#xff1a;当前我的nodejs的版本是6.14.10&#xff0c;想切换为更高的版本。故使用nvm工具来实现不同node版本之间的切换 目录 一、删除node二、nvm安装三、配置nvm镜像四、安装所需要的nodejs版本nvm常用命令 一、删除node 第一步&#xff1a;首先在控制面板删除node.j…

Java部分新特性

模式匹配 instance of 模式匹配 之前写法 public void print(Object o) {if (o instanceof String){String str (String) obj;System.out.println("This is a String of length " s.length());} else {System.out.println("This is not a String");} …

Flink--API 之 Source 使用解析

目录 一、Flink Data Sources 分类概览 &#xff08;一&#xff09;预定义 Source &#xff08;二&#xff09;自定义 Source 二、代码实战演示 &#xff08;一&#xff09;预定义 Source 示例 基于本地集合 基于本地文件 基于网络套接字&#xff08;socketTextStream&…

【三维生成】Edify 3D:可扩展的高质量的3D资产生成(英伟达)

标题&#xff1a;Edify 3D: Scalable High-Quality 3D Asset Generation 项目&#xff1a;https://research.nvidia.com/labs/dir/edify-3d demo&#xff1a;https://build.nvidia.com/Shutterstock/edify-3d 文章目录 摘要一、前言二、多视图扩散模型2.1.消融研究 三、重建模型…

Android Framework禁止弹出当前VOLTE不可用的提示窗口

文章目录 VoLTE简介VoLTE 的优势 当前VOLTE不可用的弹窗弹窗代码定位屏蔽弹出窗口 VoLTE简介 VoLTE&#xff08;Voice over LTE&#xff09;是一种基于4G LTE网络的语音通话技术。它允许用户在4G网络上进行高质量的语音通话和视频通话&#xff0c;而不需要回落到2G或3G网络。V…

微信小程序生命周期详解

一、全局生命周期 微信小程序的全局生命周期指的是小程序从启动到销毁期间经历的一系列阶段和事件。全局生命周期主要在 App() 构造器中定义&#xff0c;包括以下几个阶段&#xff1a; onLaunch&#xff1a;小程序初始化完成时触发&#xff0c;全局只触发一次。onShow&#x…

Element UI 打包探索【3】

目录 第九个命令 node build/bin/gen-cssfile gulp build --gulpfile packages/theme-chalk/gulpfile.js cp-cli packages/theme-chalk/lib lib/theme-chalk 至此&#xff0c;dist命令完成。 解释why Element UI 打包探索【1】里面的why Element UI 打包探索【2】里面…

去哪儿大数据面试题及参考答案

Hadoop 工作原理是什么&#xff1f; Hadoop 是一个开源的分布式计算框架&#xff0c;主要由 HDFS&#xff08;Hadoop 分布式文件系统&#xff09;和 MapReduce 计算模型两部分组成 。 HDFS 工作原理 HDFS 采用主从架构&#xff0c;有一个 NameNode 和多个 DataNode。NameNode 负…

深度学习中的梯度下降算法:详解与实践

梯度下降算法是深度学习领域最基础也是最重要的优化算法之一。它驱动着从简单的线性回归到复杂的深度神经网络模型的训练和优化。作为深度学习的核心工具&#xff0c;梯度下降提供了调整模型参数的方法&#xff0c;使得预测的结果逐步逼近真实值。本文将从梯度下降的基本原理出…

C++ ADL参数依赖查找

自以为作为一个C老鸟&#xff0c;对C里面各种概念应该都比较熟悉了&#xff0c;但是今天看书的时候又学到了一个装逼的概念ADL&#xff0c;本着学C装逼装到底的精神&#xff0c;就把这个概念学习了一番。 ADL 的工作原理 在C中&#xff0c;ADL 是 Argument-Dependent Lookup …

低功耗墒情监测站产品详解 如何助力高标准农田项目发展

一、产品概述 低功耗墒情监测站是一款集成了传感、无线通信、处理与控制等物联网技术的先进设备。它利用高精度传感器实时测量土壤墒情&#xff08;即土壤水分含量&#xff09;&#xff0c;并通过物联网技术将数据传输至云平台。这一创新设计无需铺设专门的通信线路&#xff0c…

VM+Ubuntu18.04+XSHELL+VSCode环境配置

前段时间换了新电脑&#xff0c;准备安装Linux学习环境&#xff1a;VM虚拟机、Ubuntu18.04操作系统、XSHELL、XFTP远程连接软件、VSCode编辑器等&#xff0c;打算把安装过程记录一下。 1. 虚拟机介绍 为什么要用虚拟机&#xff1f; 想学习Linux操作系统&#xff0c;一般有3种…

《Opencv》基础操作<1>

目录 一、Opencv简介 主要特点&#xff1a; 应用领域&#xff1a; 二、基础操作 1、模块导入 2、图片的读取和显示 &#xff08;1&#xff09;、读取 &#xff08;2&#xff09;、显示 3、 图片的保存 4、获取图像的基本属性 5、图像转灰度图 6、图像的截取 7、图…

【Android】ARouter的使用及源码解析

文章目录 简介介绍作用 原理关系 使用添加依赖和配置初始化SDK添加注解在目标界面跳转界面不带参跳转界面含参处理返回结果 源码基本流程getInstance()build()navigation()_navigation()Warehouse ARouter初始化init帮助类根帮助类组帮助类 completion 总结 简介 介绍 ARouter…

国内首家! 阿里云人工智能平台 PAI 通过 ITU 国际标准测评

近日&#xff0c;阿里云人工智能平台 PAI 顺利通过中国信通院组织的 ITU-T AICP-GA&#xff08;Technical Specification for Artificial Intelligence Cloud Platform&#xff1a;General Architecture&#xff09;国际标准和《智算工程平台能力要求》国内标准一致性测评&…