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 相关文章推荐
Windows上配置Emacs来开发Python及用Python扩展Emacs
Nov 20 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
Mar 30 Python
Python批量合并有合并单元格的Excel文件详解
Apr 05 Python
tensorflow 输出权重到csv或txt的实例
Jun 14 Python
Python爬虫使用脚本登录Github并查看信息
Jul 16 Python
Tensorflow 同时载入多个模型的实例讲解
Jul 27 Python
python requests抓取one推送文字和图片代码实例
Nov 04 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
Dec 25 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
Mar 01 Python
Python 多线程共享变量的实现示例
Apr 17 Python
Pycharm导入anaconda环境的教程图解
Jul 31 Python
Django自带的用户验证系统实现
Dec 18 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
如何使用php判断所处服务器操作系统的类型
2013/06/20 PHP
PHP中常用的输出函数总结
2014/09/22 PHP
php格式化时间戳显示友好的时间实现思路及代码
2014/10/23 PHP
yii用户注册表单验证实例
2015/12/26 PHP
phpcms的分类名称和类别名称的调用
2017/01/05 PHP
Symfony查询方法实例小结
2017/06/28 PHP
php表单处理操作
2017/11/16 PHP
PHP数字金额转换成中文大写显示
2019/01/05 PHP
$.format,jquery.format 使用说明
2011/07/13 Javascript
jQuery对html元素取值与赋值的方法
2013/11/20 Javascript
JavaScript验证图片类型(扩展名)的函数分享
2014/05/05 Javascript
jQuery实现统计复选框选中数量
2014/11/24 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
Vue.js动态组件解析
2016/09/09 Javascript
在vue项目中引用Iview的方法
2018/09/14 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
详解为什么Vue中不要用index作为key(diff算法)
2020/04/04 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
el-form 多层级表单的实现示例
2020/09/10 Javascript
Python版的文曲星猜数字游戏代码
2013/09/02 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
2017/06/07 Python
解决python3 网络请求路径包含中文的问题
2018/05/10 Python
如何用python整理附件
2018/05/13 Python
python 检查文件mime类型的方法
2018/12/08 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
python二维图制作的实例代码
2020/12/03 Python
python利用proxybroker构建爬虫免费IP代理池的实现
2021/02/21 Python
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
财务会计专业毕业生自荐信
2013/10/19 职场文书
英语国培研修感言
2014/02/13 职场文书
竞选学委演讲稿
2014/09/13 职场文书
文明礼仪主题班会
2015/08/13 职场文书
nginx常用命令放入shell脚本详解
2021/03/31 Servers
排查MySQL生产环境索引没有效果
2022/04/11 MySQL
Spring Boot配合PageHelper优化大表查询数据分页
2022/04/20 Java/Android