Python xpath表达式如何实现数据处理


Posted in Python onJune 13, 2020

xpath表达式

1. xpath语法

<bookstore>
<book>
 <title lang="eng">Harry Potter</title>
 <price>999</price>
</book>
<book>
 <title lang="eng">Learning XML</title>
 <price>888</price>
</book>
</bookstore>

1.1 选取节点

XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。

使用chrome插件选择标签时候,选中时,选中的标签会添加属性class="xh-highlight"

下面列出了最有用的表达式:

表达式 描述
nodename 选中该元素。
/ 从根节点选取、或者是元素和元素间的过渡。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。
text() 选取文本。

实例

路径表达式 结果
bookstore 选择bookstore元素。
/bookstore 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//book/title/@lang 选择所有的book下面的title中的lang属性的值。
//book/title/text() 选择所有的book下面的title的文本。
  • 选择所有的h1下的文本
  • //h1/text()
  • 获取所有的a标签的href
  • //a/@href
  • 获取html下的head下的title的文本
  • /html/head/title/text()
  • 获取html下的head下的link标签的href
  • /html/head/link/@href

1.2 查找特定的节点

路径表达式 结果
//title[@lang="eng"] 选择lang属性值为eng的所有title元素
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()>1] 选择bookstore下面的book元素,从第二个开始选择
//book/title[text()='Harry Potter'] 选择所有book下的title元素,仅仅选择文本为Harry Potter的title元素
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

注意点: 在xpath中,第一个元素的位置是1,最后一个元素的位置是last(),倒数第二个是last()-1

1.3 选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
/bookstore/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。

1.4 选取若干路径

通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
//book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
//title | //price 选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

实例:

from lxml import etree
text = ''' <div> <ul> 
    <li class="item-1"><a href="link1.html" rel="external nofollow" >first item</a></li> 
    <li class="item-1"><a href="link2.html" rel="external nofollow" >second item</a></li> 
    <li class="item-inactive"><a href="link3.html" rel="external nofollow" >third item</a></li> 
    <li class="item-1"><a href="link4.html" rel="external nofollow" >fourth item</a></li> 
    <li class="item-0"><a href="link5.html" rel="external nofollow" >fifth item</a> 
    </ul> </div> '''

html = etree.HTML(text)

#获取href的列表和title的列表
href_list = html.xpath("//li[@class='item-1']/a/@href")
title_list = html.xpath("//li[@class='item-1']/a/text()")


#组装成字典
for href in href_list:
  item = {}
  item["href"] = href
  item["title"] = title_list[href_list.index(href)]
  print(item)

# 如果取到的是一个节点,返回的是element对象,可以继续使用xpath方法,对此我们可以在后面的数据提取过程中:先根据某个标签进行分组,分组之后再进行数据的提取
li_list = html.xpath("//li[@class='item-1']")

#在每一组中继续进行数据的提取
for li in li_list:
  item = {}
  item["href"] = li.xpath("./a/@href")[0] if len(li.xpath("./a/@href"))>0 else None
  item["title"] = li.xpath("./a/text()")[0] if len(li.xpath("./a/text()"))>0 else None
  print(item)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python基于mysql实现的简单队列以及跨进程锁实例详解
Jul 07 Python
酷! 程序员用Python带你玩转冲顶大会
Jan 17 Python
解决python写入mysql中datetime类型遇到的问题
Jun 21 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
May 23 Python
Python 3 判断2个字典相同
Aug 06 Python
Python一键安装全部依赖包的方法
Aug 12 Python
Python values()与itervalues()的用法详解
Nov 27 Python
Django的ListView超详细用法(含分页paginate)
May 21 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
Jul 05 Python
详解Python利用configparser对配置文件进行读写操作
Nov 03 Python
Python列表的深复制和浅复制示例详解
Feb 12 Python
PyCharm 安装与使用配置教程(windows,mac通用)
May 12 Python
Python轻量级web框架bottle使用方法解析
Jun 13 #Python
PyInstaller运行原理及常用操作详解
Jun 13 #Python
Pandas缺失值2种处理方式代码实例
Jun 13 #Python
Python Django中间件使用原理及流程分析
Jun 13 #Python
Django QuerySet查询集原理及代码实例
Jun 13 #Python
Python celery原理及运行流程解析
Jun 13 #Python
基于Python实现视频的人脸融合功能
Jun 12 #Python
You might like
PHP4在WinXP下IIS和Apache2服务器上的安装实例
2006/10/09 PHP
留言板翻页的实现详解
2006/10/09 PHP
PHP n个不重复的随机数生成代码
2009/06/23 PHP
php新建文件自动编号的思路与实现
2011/06/27 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
详解PHP使用Redis存储session时的一个Warning定位
2017/07/05 PHP
脚本吧 - 幻宇工作室用到js,超强推荐base.js
2006/12/23 Javascript
js模拟点击事件实现代码
2012/11/06 Javascript
zTree插件之单选下拉菜单实例代码
2013/11/07 Javascript
js鼠标点击图片实现随机变换图片的方法
2015/02/16 Javascript
JS简单实现城市二级联动选择插件的方法
2015/08/19 Javascript
基于JS实现Android,iOS一个手势动画效果
2016/04/27 Javascript
jQuery前端开发35个小技巧
2016/05/24 Javascript
AngularJS入门之动画
2016/07/27 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
2017/03/17 Javascript
vue router2.0二级路由的简单使用
2017/07/05 Javascript
基于datepicker定义自己的angular时间组件的示例
2018/03/14 Javascript
Vue移动端项目实现使用手机预览调试操作
2020/07/18 Javascript
基于Vue全局组件与局部组件的区别说明
2020/08/11 Javascript
vue element-ul实现展开和收起功能的实例代码
2020/11/25 Vue.js
实例探究Python以并发方式编写高性能端口扫描器的方法
2016/06/14 Python
基于随机梯度下降的矩阵分解推荐算法(python)
2018/08/31 Python
Python开启线程,在函数中开线程的实例
2019/02/22 Python
python爬虫请求头设置代码
2020/07/28 Python
如何用Python 加密文件
2020/09/10 Python
纯CSS实现右侧底部悬浮效果(悬浮QQ、微信、微博、邮箱等联系方式)
2015/04/24 HTML / CSS
女士和男士时尚鞋在线购物:Shoespie
2019/02/28 全球购物
介绍一下linux的文件系统
2015/10/06 面试题
寄语学生的话
2014/04/10 职场文书
电子商务求职信
2014/06/15 职场文书
中职生自荐信范文
2014/06/15 职场文书
大二学生学年自我鉴定
2014/09/12 职场文书
工作证明范本(2篇)
2014/09/14 职场文书
先进基层党组织材料
2014/12/25 职场文书
人与自然观后感
2015/06/16 职场文书
银行中层干部培训心得体会
2016/01/11 职场文书