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实现的tab文件操作类分享
Nov 20 Python
Python中有趣在__call__函数
Jun 21 Python
Python Web框架Tornado运行和部署
Oct 19 Python
python xlsxwriter创建excel图表的方法
Jun 11 Python
python 字符串和整数的转换方法
Jun 25 Python
win8下python3.4安装和环境配置图文教程
Jul 31 Python
pandas中DataFrame修改index、columns名的方法示例
Aug 02 Python
python hash每次调用结果不同的原因
Nov 21 Python
Python实现图片添加文字
Nov 26 Python
Python装饰器的应用场景代码总结
Apr 10 Python
Python 解决相对路径问题:&quot;No such file or directory&quot;
Jun 05 Python
python基于turtle绘制几何图形
Jun 15 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
动漫女神老婆无限好,但日本女生可能就不是这么一回事了!
2020/03/04 日漫
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
php检测数组长度函数sizeof与count用法
2014/11/17 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
疯掉了,尽然有js写的操作系统
2007/04/23 Javascript
JQuery实现的在新窗口打开链接的方法小结
2010/04/22 Javascript
js控制文本框只能输入中文、英文、数字与指定特殊符号的实现代码
2016/09/09 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
2016/10/18 Javascript
js实现百度登录框鼠标拖拽效果
2017/03/07 Javascript
JavaScript中各数制转换全面总结
2017/08/21 Javascript
js精确的加减乘除实例
2017/11/14 Javascript
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
2017/12/23 Javascript
在vue使用clipboard.js进行一键复制文本的实现示例
2019/01/15 Javascript
Vue.js实现的购物车功能详解
2019/01/27 Javascript
Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
2019/04/22 Javascript
实例详解带参数的 npm script
2019/05/28 Javascript
解决使用layui对select append元素无效或者未及时更新的问题
2019/09/18 Javascript
Python 异常处理实例详解
2014/03/12 Python
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
python Django的web开发实例(入门)
2019/07/31 Python
关于初始种子自动选取的区域生长实例(python+opencv)
2020/01/16 Python
matplotlib.pyplot.plot()参数使用详解
2020/07/28 Python
Python连接Impala实现步骤解析
2020/08/04 Python
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
SheIn沙特阿拉伯:女装在线
2020/03/23 全球购物
什么是.net的Remoting技术
2016/07/08 面试题
优良学风班总结材料
2014/02/08 职场文书
班级学习计划书
2014/04/27 职场文书
卫校毕业生自我鉴定
2014/09/28 职场文书
2014年应急管理工作总结
2014/11/26 职场文书
2015年护士节活动策划方案
2015/05/04 职场文书
2016党员干部廉洁自律心得体会
2016/01/13 职场文书
小学二年级语文教学反思
2016/03/03 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
Python中threading库实现线程锁与释放锁
2021/05/17 Python