xpath 解析(基础)

解析xml

首先要下载包:pip install lxml

基本使用如下代码所示:

# xpath 解析:先安装lxml:pip install lxml
from lxml import etreexml = """
<book><id>1</id><name>山花遍地开</name><price>9.99</price><nick>臭豆腐</nick><author><nick id="1001">周六福</nick><nick id="joy">周杰伦</nick><nick id="jolin">蔡依林</nick><div><nick>呼哈1</nick></div><span><nick>呼哈2</nick></span></author><partner><nick id="ppd">胖胖哒</nick><nick id="nnn">nonono</nick></partner>
</book>
"""
# etree.XML(xml) 表示解析的字符串是XML
# 此外还有etree.HTML(text) 表示解析的是HTML
# etree.parse('文件路径') 可以传入一个文件,然后解析该文件
tree = etree.XML(xml)
# 获取book节点
book = tree.xpath('/book')  # /表示层级关系,第一个/是根节点
print(book)  # [<Element book at 0x26f27a5cdc0>]# 获取book节点下的name节点
name = tree.xpath('/book/name')
print(name)  # [<Element name at 0x26f27e57740>]# text() 获取节点的文本内容
# 获取name节点的文本内容
name_text = tree.xpath('/book/name/text()')
print(name_text)  # ['山花遍地开']# 获取author节点下的nick儿子节点,即直接被author节点包裹,而不是隔着其他节点的
# 如"周六福"、"周杰伦"、"蔡依林"是被直接包裹,而"呼哈1"隔着一层div节点
author_son_nick = tree.xpath('/book/author/nick/text()')
print(author_son_nick)  # ['周六福', '周杰伦', '蔡依林']# // 表示获取父节点下的某个名称的所有子节点,包括儿子、孙子、重孙子等
# 如此处获取author节点下的所有nick节点,包括直接包裹和隔着其他节点的,只要是在author下的都算
author_offspring_nick = tree.xpath('/book/author//nick/text()')
print(author_offspring_nick)  # ['周六福', '周杰伦', '蔡依林', '呼哈1', '呼哈2']# * 通配符,可以匹配任意的节点
# 如此处*可以匹配div节点和span节点,得到author节点下的div和span下的nick节点
# 即“呼哈1”、“呼哈2”
nick = tree.xpath('/book/author/*/nick/text()')
print(nick)  # ['呼哈1', '呼哈2']

解析html

test.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8" /><title>Title</title>
</head>
<body><h1>标题1</h1><h2>标题2</h2><h3>标题3</h3><div id="content" class="default"><p>段落</p><ul><li><a class="baidu" href="http://www.baidu.com">百度</a></li><li><a class="iqiyi" href="http://www.iqiyi.com">爱奇艺</a></li></ul><img src="https://www.python.org/static/img/python-logo.png" /></div>
</body>
</html>

使用xpath解析test.hml文件:

# 注意,以下注释中的标签、节点、元素都是一个意思,只是叫法不用
# 对一个HTML文件进行解析
tree = etree.parse('test.html')# 获取html节点
html = tree.xpath('/html')
print(html)  # [<Element html at 0x1d819cc7300>]# 获取div节点下ul里的li标签中的两个a标签里文本
as_text = tree.xpath('/html/body/div/ul/li/a/text()')
print(as_text)  # ['百度', '爱奇艺']# [index] 中括号加索引表示获取第index个标签,注意索引从1开始
# 获取ul里的第一个li标签下的a标签中的文本
first_a_text = tree.xpath('/html/body/div/ul/li[1]/a/text()')
print(first_a_text)  # ['百度']# [@属性名=属性值] 根据某个属性值获取指定节点
# 获取class属性为"iqiyi"的a标签
iqiyi_a = tree.xpath('/html/body/div/ul/li/a[@class="iqiyi"]/text()')
print(iqiyi_a)  # ['爱奇艺']# 遍历ul中的li
ul_li_list = tree.xpath('/html/body/div/ul/li')
print(ul_li_list)  # [<Element li at 0x1fd7694c1c0>, <Element li at 0x1fd7694c200>]
for li in ul_li_list:# ./表示相对当前节点,即相对li查找a标签a_text = li.xpath('./a/text()')print(a_text)  # 分别打印['百度']、['爱奇艺']# @属性名 表示获取标签的某个属性值# 打印a标签的href属性href = li.xpath('./a/@href')print(href)  # 分别打印['http://www.baidu.com']、['http://www.iqiyi.com']# 一次性获取div节点下ul里的li标签中的两个a标签的href属性值(和获取文本类似)
href_val = tree.xpath('/html/body/div/ul/li/a/@href')
print(href_val)  # ['http://www.baidu.com', 'http://www.iqiyi.com']

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

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

相关文章

nmap端口扫描工具安装和使用方法

nmap&#xff08;Network Mapper&#xff09;是一款开源免费的针对大型网络的端口扫描工具&#xff0c;nmap可以检测目标主机是否在线、主机端口开放情况、检测主机运行的服务类型及版本信息、检测操作系统与设备类型等信息。本文主要介绍nmap工具安装和基本使用方法。 nmap主…

【Java】编写一个简单的Servlet程序

Java Servlet 是运行在 Web 服务器或应用服务器上的程序&#xff0c;它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。 使用 Servlet&#xff0c;可以收集来自网页表单的用户输入&#xff0c;呈现来自数据库或者其他源的记录…

LC24. 两两交换链表中的节点

代码随想录 class Solution {// 举例子:假设两个节点 1 -> 2// 那么 head 1; next 2; next.next null// 那么swapPairs(next.next),传入的是null,再下一次递归中直接返回null// 因此 newNode null// 所以 next.next head; > 2.next 1; 2 -> 1// head.next…

在MongoDB中使用数组字段和子文档字段进行索引

本文主要介绍在MongoDB使用数组字段和子文档字段进行索引。 目录 MongoDB的高级索引一、索引数组字段二、索引子文档字段 MongoDB的高级索引 MongoDB是一个面向文档的NoSQL数据库&#xff0c;它提供了丰富的索引功能来加快查询性能。除了常规的单字段索引之外&#xff0c;Mong…

Ubuntu 常用命令之 shutdown 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 shutdown 是 Ubuntu 系统下的一个命令&#xff0c;用于关闭或重启系统。这个命令可以让系统在一个特定的时间点进行关机或者重启&#xff0c;也可以立即执行。 shutdown 命令的基本格式如下 shutdown [选项] 时间 [警告消息]选项…

react当中生命周期(旧生命周期详解)

新生命周期https://blog.csdn.net/kkkys_kkk/article/details/135156102?spm1001.2014.3001.5501 目录 什么是生命周期 react中的生命周期 旧生命周期 生命周期图示 常用的生命周期钩子函数 初始化阶段 挂载阶段 在严格模式下挂载阶段的生命周期函数会执行两次原因 更…

软件渗透测试有哪些测试流程?权威安全测试报告的重要性

软件渗透测试也是安全测试的一种&#xff0c;是通过模拟恶意黑客的攻击方法&#xff0c;来评估计算机网络系统安全的一种评估方法。作为网络安全防范的一种新技术&#xff0c;对于网络安全组织具有实际应用价值。 一、软件渗透测试的过程   软件渗透测试的过程通常包括四个主…

前端学习——vuex的入门

学习一门技术最快捷的方式就是先了解其概念和使用场景&#xff0c;毕竟任何技术的出现都是为了解决某一个场景下的通用解决方案&#xff0c;并且使用最合理的方式去解决问题。 那么什么是vuex&#xff1f; Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 库。它采用集中…

JavaScript高级 ES6篇

前面的内容主要讲的是JavaScript基础内容&#xff0c;想要更加了解前端的小朋友们&#xff0c;需要再继续努力&#xff0c;我们开始向JavaScript高级内容出发了呦&#xff0c;不要掉队啦&#xff01; 一、变量与常量的声明 1.1 var 关键字声明变量 语法&#xff1a; var 变…

基于ssm+jsp学生综合测评管理系统源码和论文

网络的广泛应用给生活带来了十分的便利。所以把学生综合测评管理与现在网络相结合&#xff0c;利用java技术建设学生综合测评管理系统&#xff0c;实现学生综合测评的信息化。则对于进一步提高学生综合测评管理发展&#xff0c;丰富学生综合测评管理经验能起到不少的促进作用。…

轻量级Python IDE使用(二)——缩进规则

1、缩进对程序的影响 1.1、缩进不符合规则&#xff0c;解析器会报错&#xff0c;程序无法运行 a 0print(a)print(a)的缩进不符合缩进规则&#xff0c;程序在第二行发生错误。 1.2、符合规则&#xff0c;但缩进位置不同&#xff0c;程序执行的逻辑会有差异。 isP False if…

OPC UA 与PROFINET比较

ROFINET和OPC UA是两种常见的协议&#xff0c;过去这两个协议有两个不同的角色。PROFINET通常用于现场设备和本地控制器之间的实时数据通信。而OPC UA通常用于在本地控制器和更高级别的MES和SCADA系统之间进行通信。 OPC UA 网络架构 PROFINET网络由IO控制器和IO设备组成&…

【数据结构】什么是树?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 &#x1f4cc;树的定义 树(Tree)是n(n≥0)个结点的有限集.n0时称为空树. 在任意一颗非空树中: 有且仅有一个特定的称为根(Root)的结点;当n>1时,其余结点可分为m(m>0)个互…

Laravel框架使用phpstudy本地安装的composer用Laravel 安装器进行安装搭建

一、首先需要安装Laravel 安装器 composer global require laravel/installer 二、安装器安装好后&#xff0c;可以使用如下命令创建项目 laravel new sys 三、本地运行 php artisan serve 四、 使用Composer快速安装Laravel5.8框架 安装指定版本的最新版本&#xff08;推荐&a…

虚拟机磁盘扩容

https://www.xjx100.cn/news/528878.html?actiononClick https://blog.csdn.net/ytraister/article/details/129631653 PC电脑 VMware安装的linux CentOs7如何扩容磁盘&#xff1f; - 知乎 (zhihu.com) 解决虚拟机磁盘满了&#xff0c;无法上传文件&#xff0c;给虚拟机扩容问…

怎样写一个C语言程序计算以下问题?

怎样写一个C语言程序计算以下问题&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C语言的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01…

Python 将RTF文件转为Word 、PDF、HTML

RTF也称富文本格式&#xff0c;是一种具有良好兼容性的文档格式&#xff0c;可以在不同的操作系统和应用程序之间进行交换和共享。有时出于不同项目的需求&#xff0c;我们可能需要将RTF文件转为其他格式。本文将介如何通过简单的Python代码将RTF文件转换为Word Doc/Docx、PDF、…

MySQL数据库基础和基本的增删改查操作

目录 前瞻 数据库的基本概念 数据库管理系统&#xff08;DBMS&#xff09; 数据库系统(DBS) 数据库类型和常用数据库 关系型数据库 SQL 非关系型数据库 NoSQL SQL语句 简介 SQL语句分类 常用的数据类型 MySQL的六大约束特性 SQL语句的使用 创建及删除数据库和表 …

【小白专用】php以pdo方式连接sqlserver,开启sqlsrv扩展

一、安装ODBC程序&#xff0c; 下载适用于 SQL Server 的 ODBC 驱动程序 - 适用于 SQL Server 的 ODBC 驱动程序 |Microsoft 学习 运行安装程序&#xff0c;出现如下图所示页面&#xff1b; 选择下一步&#xff1b;选择我同意许可协议中的条款后选择下一步&#xff1b; 点击安…

c语言易错题之数据类型变换

1.题目 #include<stdio.h> int main() {int arr[]{1,2,3,4,5};short*p (short*)arr;int i 0;for(i0;i<4;i){*(pi)0;}for(i0;i<5;i){printf("%d ",arr[i];}return 0; }2.解析 这道题主要容易错在&#xff0c;大家会以为通过指针赋值的时候&#xff0c;…