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中MySQLdb和torndb模块对MySQL的断连问题处理
Nov 09 Python
Zabbix实现微信报警功能
Oct 09 Python
Python实现string字符串连接的方法总结【8种方式】
Jul 06 Python
python计算两个矩形框重合百分比的实例
Nov 07 Python
Python 运行 shell 获取输出结果的实例
Jan 07 Python
python3下载抖音视频的完整代码
Jun 05 Python
python获取指定日期范围内的每一天,每个月,每季度的方法
Aug 08 Python
Django--权限Permissions的例子
Aug 28 Python
tensorflow 限制显存大小的实现
Feb 03 Python
Python中的xlrd模块使用原理解析
May 21 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
Sep 23 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
Feb 22 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
用缓存实现静态页面的测试
2006/12/06 PHP
php对象工厂类完整示例
2018/08/09 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
2019/08/12 PHP
PHP 实现base64编码文件上传出现问题详解
2020/09/01 PHP
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
2010/12/02 Javascript
JS获取并操作iframe中元素的方法
2013/03/21 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
2013/06/16 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
JavaScript 数组some()和filter()的用法及区别
2016/05/20 Javascript
Javascript中的arguments对象
2016/06/20 Javascript
Jquery组件easyUi实现表单验证示例
2016/08/23 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
利用BootStrap的Carousel.js实现轮播图动画效果
2016/12/21 Javascript
详解微信小程序 template添加绑定事件
2017/06/23 Javascript
React 子组件向父组件传值的方法
2017/07/24 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
js 实现在2d平面上画8的方法
2018/10/10 Javascript
jQuery点击页面其他部分隐藏下拉菜单功能
2018/11/27 jQuery
jquery实现图片无缝滚动 蒙版遮蔽效果
2020/01/11 jQuery
Python如何获取系统iops示例代码
2016/09/06 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
2017/07/13 Python
执行Django数据迁移时报 1091错误及解决方法
2019/10/14 Python
Python异常模块traceback用法实例分析
2019/10/22 Python
英国汽车座椅和婴儿车购物网站:Uber Kids
2017/04/19 全球购物
兰蔻英国官网:Lancome英国
2019/04/30 全球购物
个人简历中的自我评价范例
2013/10/29 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
干部个人考察材料
2014/12/24 职场文书
党员公开承诺书2015
2015/01/21 职场文书
上课睡觉万能检讨书
2015/02/17 职场文书
员工自我评价范文
2015/03/11 职场文书
2016年6.5世界环境日宣传活动总结
2016/04/01 职场文书
MongoDB balancer的使用详解
2021/04/30 MongoDB
Java各种比较对象的方式的对比总结
2021/06/20 Java/Android
python​格式化字符串
2022/04/20 Python