[XPath/Python] XPath 与 lxml (三)XPath 坐标轴

本章我们将沿用上一章的 XML 示例文档。

XPath 坐标轴

坐标轴用于定义当对当前节点的节点集合。

坐标轴名称 含义
ancestor 选取当前节点的所有先辈元素及根节点。
ancestor-or-self 选取当前节点的所有先辈以及当前节点本身。
attibute 选取当前节点的所有属性。
child 选取当前节点的所有子元素。
descendant 选取当前节点的所有后代元素。
descendant-or-self 选取当前节点的所有后代元素以及当前节点本身。
following 选取文档中当前节点的结束标签之后的所有节点。
following-sibling 选取当前节点之后的所有同级节点
namespace 选取当前节点的所有命名空间节点。
parent 选取当前节点的父节点。
preceding 选取当前节点的开始标签之前的所有节点。
preceding-sibling 选取当前节点之前的所有同级节点。
self 选取当前节点。

位置路径表达式

位置路径可以是绝对路径,也可以是相对路径。绝对路径以 "/" 开头。每条路径包括一个或多个步,每步之间以 "/" 分隔。

绝对路径:/step/step/...

相对路径:step/step/...

每步根据当前节点集合中的节点计算。

步(step)包括三部分:

  • 坐标轴(axis):定义所选节点与当前节点之间的关系。
  • 节点测试(node-test):识别某个坐标轴内部的节点。
  • 预判(predicate):提出预判条件对节点集合进行筛选。

步的语法:

坐标轴::节点测试[预判]

实例

# child::nodename 选取所有属于当前节点的 book 子元素,等价于 ‘./nodename‘
>>> root.xpath(‘child::book‘)
[<Element book at 0x2d888c8>, <Element book at 0x2d88878>]
>>> root.xpath(‘./book‘)
[<Element book at 0x2d888c8>, <Element book at 0x2d88878>]

# attribute::lang 选取当前节点的 lang 属性,等价于 ‘./@lang‘
>>> root.xpath(‘//*[@lang]‘)[0].xpath(‘attribute::lang‘)
[‘eng‘]
>>> root.xpath(‘//*[@lang]‘)[0].xpath(‘@lang‘)
[‘eng‘]

# child::* 选取当前节点的所有子元素,等价于 ‘./*‘
>>> root.xpath(‘child::*‘)
[<Element book at 0x2d88878>, <Element book at 0x2d88738>]
>>> root.xpath(‘./*‘)
[<Element book at 0x2d88878>, <Element book at 0x2d88738>]

# attribute::* 选取当前节点的所有属性,等价于 ‘./@*‘
>>> root.xpath(‘//*[@*]‘)[0].xpath(‘attribute::*‘)
[‘eng‘]
>>> root.xpath(‘//*[@*]‘)[0].xpath(‘@*‘)
[‘eng‘]

# child::text() 选取当前节点的所有文本子节点,等价于 ‘./text()‘
>>> root.xpath(‘child::text()‘)
[‘\n    ‘, ‘\n    ‘, ‘\n‘]
>>> root.xpath(‘./text()‘)
[‘\n    ‘, ‘\n    ‘, ‘\n‘]

# child::node() 选取当前节点所有子节点,等价于 ‘./node()‘
>>> root.xpath(‘child::node()‘)
[‘\n    ‘, <Element book at 0x2d88878>, ‘\n    ‘, <Element book at 0x2d88738>, ‘\n‘]
>>> root.xpath(‘./node()‘)
[‘\n    ‘, <Element book at 0x2d88878>, ‘\n    ‘, <Element book at 0x2d88738>, ‘\n‘]

# descendant::book 选取当前节点所有 book 后代,等价于 ‘.//book‘
>>> root.xpath(‘descendant::book‘)
[<Element book at 0x2d88878>, <Element book at 0x2d88738>]
>>> root.xpath(‘.//book‘)
[<Element book at 0x2d88878>, <Element book at 0x2d88738>]

# ancestor::book 选取当前节点所有 book 先辈
>>> root.xpath(‘.//title‘)[0].xpath(‘ancestor::book‘)
[<Element book at 0x2d88878>]

# ancestor-or-self::book 选取当前节点的所有 book 先辈以及如果当前节点是 book 的话也要选取
>>> root.xpath(‘.//title‘)[0].xpath(‘ancestor-or-self::book‘)
[<Element book at 0x2d88878>]
>>> root.xpath(‘.//book‘)[0].xpath(‘ancestor-or-self::book‘)
[<Element book at 0x2d88878>]
>>> root.xpath(‘.//book‘)[0].xpath(‘ancestor::book‘)
[]

# child::*/child::price 选取当前节点的所有 price 孙节点,等价于 ‘./*/price‘
>>> root.xpath(‘child::*/child::price‘)
[<Element price at 0x2d88878>, <Element price at 0x2d88738>]
>>> root.xpath(‘./*/price‘)
[<Element price at 0x2d88878>, <Element price at 0x2d88738>]

[XPath/Python] XPath 与 lxml (三)XPath 坐标轴

时间: 2024-10-11 08:47:40

[XPath/Python] XPath 与 lxml (三)XPath 坐标轴的相关文章

[XPath/Python] XPath 与 lxml (五)XPath 实例

本文继续沿用第三章的 XML 示例文档. 选取价格高于30的 price 节点 # 从父节点进行筛选 >>> root.xpath('//book[price>30]/price') [<Element price at 0x2d888c8>] # 直接对 price 进行筛选 >>> root.xpath('//price[text()>30]') [<Element price at 0x2d888c8>] 选取 price 高于

[XPath/Python] XPath 与 lxml (二)XPath 语法

XPath 选取节点时使用的表达式是一种路径表达式.节点是通过路径(path)或者步(steps)来选取的. 本章使用以下 XML 文档作为示例. <?xml version="1.0" encoding="utf8"?> <bookstore> <book> <title lang="eng">Harry Potter</title> <price>29.99</pr

lxml etree xpath

from lxml import etree #####################基本用法: ##################### html = ''' <h1 class="header">登录</h1> <form action="/login" method="post"> <label for="username">用户: </label><

lxml结合xpath注意事项

使用Xpath语法,应该使用Element.xpath方法,来执行xpath选择,示例代码如下: trs = html.xpath("//tr[position()>2]") xpath函数返回的永远是一个列表 2.获取某个标签的属性: href = html.xpath("//a/@href") 3.获取文本 , 通过xpath下的text()函数: address = tr.xpath("./td[4]/text()")[0] 4.在某

XPath语法 在C#中使用XPath示例 【转http://www.cnblogs.com/yukaizhao/archive/2011/07/25/xpath.html】非常详细的文章

XPath语法 在C#中使用XPath示例 XPath可以快速定位到Xml中的节点或者属性.XPath语法很简单,但是强大够用,它也是使用xslt的基础知识. 示例Xml: <?xml version="1.0" encoding="utf-8" ?> <pets> <cat color="black" weight="10"> <price>100</price>

visual studio 2015 搭建python开发环境,python入门到精通[三]

在上一篇博客Windows搭建python开发环境,python入门到精通[一]很多园友提到希望使用visual studio 2013/visual studio 2015 python做demo,这里略带一句,其实就"学习python"而言,比较建议使用pycharm,pycharm可以设置VS或者eclipse等多种IDE的编码,可以让绝大部分其他语言使用IDE的习惯者更容易上手.这一点兼容确实做的很好.不过既然这么多园友要求使用vs开发python的话,就介绍一下visual

python机器学习实战(三)

python机器学习实战(三) 版权声明:本文为博主原创文章,转载请指明转载地址 www.cnblogs.com/fydeblog/p/7277205.html  前言 这篇博客是关于机器学习中基于概率论的分类方法--朴素贝叶斯,内容包括朴素贝叶斯分类器,垃圾邮件的分类,解析RSS源数据以及用朴素贝叶斯来分析不同地区的态度. 操作系统:ubuntu14.04 运行环境:anaconda-python2.7-jupyter notebook 参考书籍:机器学习实战和源码,机器学习(周志华) not

七日Python之路--第三天

之前由于看基础看的觉着没意思,才去提前看一下Django的.现在突然不知到该干啥了. 不管什么语言,官方文档是必须的.so........... 莫名浮躁,实在看不下去........   待会研究 re 吧.虽然之前研究过,但许久不使用,忘的差不多了....Orz. --2014.7.23 18:37 正则表达式: 1.掌握正则表达式的规则 正则表达式是一种小型,高度专业化的编程语言,内嵌Python中,通过re模块实现. 正则表达式模式被编译成一系列字节码,由用C编写的匹配引擎执行. 字符匹

python实现堆排序的三种方式

# -*- coding: utf-8 -*- """ Created on Fri May 16 14:57:50 2014 @author: lifeix """ import heapq #堆排序 #第一种实现 def Heapify(a, start, end): left = 0 right = 0 maxv = 0 left = start * 2 right = start * 2 + 1 while left <= end: