xpath 高级用法

1. 匹配当前节点下的所有:

.//
. 表示当前
// 表示当前标签下的所有标签
注: 要配合使用

2. 匹配某标签的属性值: /@属性名称

这里以input里的value值为例:

例:xpath(//input/@value)

3. 匹配多个路径

在一个xpath中写的多个表达式用 | 分开, 每个表达式互不干扰。
xpath("//tr[6]/td[2]/text() | //tr[7]/td[2]/text()")

4. 按属性匹配:@获取所有id="test"的所有文本内容

xpath('//*[@id="test"]//text()')

5. 匹配不包含某个属性的标签 not

多用于表格中匹配中不包含表头信息的数据
xpath('//table/tr[not(@class="tbhead")]')

6. 匹配包含多个属性的标签: and匹配所有的tr中不包含 tbhead 属性 和包含 head 的tr标签

xpath('//table/tr[not(@class="tbhead") and @class="head"]')

7. 匹配包含不同属性的名称相同的标签

or匹配包含class="speedbar" 或者 class="content-wrap" 的标签

xpath('//div[@class="speedbar" or @class="content-wrap"]')

8. 将对象还原为字符串:

etree.tostring()将匹配到的对象,作为etree.tostring()的参数即可,  注: 返回字符串

sObj = xml.xpath('//*[@id="test"]')[0] #使用xpath定位一个节点
sStr = etree.tostring(sObj)

9. 按轴(Axes)匹配

9.1 选取当前节点的所有子元素: child获取div下的tr的标签

xpath('//div[@id="testid"]/child::tr/td/text()') # 感觉这种方法鸡肋,
//div[@id="testid"]//tr/td 也可以实现

9.2 选取当前节点的所有属性:attribute

获取div标签所有的属性值

xpath('//div/attribute::*') # 感觉这种方法鸡肋,//div/@* 同样能实现

9.3 ancestor:父辈元素 / ancestor-or-self:父辈元素及当前元素

获取父辈元素的div的所有属性值, 在不好定位的情况下,通过孩子标签定位,这种方法可以用

xpath('//div[@id="test"]/ancestor::div/@*')
xpath('//div[@id="test"]/ancestor-or-self::div/@*')

9.4 descendant:后代 / descendant-or-self:后代及当前节点本身

获取孩子元素的div的所有属性值,感觉鸡肋

xpath('//div[@id="test"]/descendant::div/@*')
xpath('//div[@id="test"]/descendant-or-self::div/@*')

9.5 选取当前节点的所有命名空间节点:namespace

xpath('//div[@id="test"]/namespace::*')

9.6 定位:position

和通过下标定位一样, 方法鸡肋

xpath('//*[@id="test"]/ol/li[position()=2]/text()')

10.Xpath 函数:

10.1统计数量:count

统计符合要求节点的数量,  注: 返回字符串

xpath('count(//tr[@info])')

10.2 字符串拼接 :concat

统计出来的两个内容的字符串进行“ + ”处理, 注: 返回字符串

xpath('concat(//li[@id="one"]/text(),//li[@id="three"]/text())')

10.3 解析当前节点下的字符:string

string()直解析匹配的第一个标签的值,  注: 返回字符串

xpath('string(//tr)')

10.4 获取当前节点的节点名称: local-name

返回当前属性的节点名称,  注: 返回字符串

xpath('local-name(//*[@id="test"])')

10.5 以指定的字符开头:starts-with

starts-with定位属性值以8开头的li元素

xpath('//tr[starts-with(@code,"one")]/text()')

10.6 小于:<

匹配所有tr标签属性info小于200的内容

xpath('//tr[@info<200]/text()')

11. 根据指定的文本内容选择

# 指定的文本内容可以是文本内容的部分, 也可以是全部
//div[2]/ul/li[contains(text(), "指定的文本内容")]/span/text()

12 . 获取在此节点下的所有内容

//*[@class="init-content"]/..

13 position:定位

选择偶数项:[position()=(position() mod 2 = 0)]

选择奇数项:[position()=(position() mod 2 != 0)]

14 其他

后面+:: 然后输入标签 或者数字

child:选取当前节点的子元素
parent:选取当前节点的父节点
attribute:选取当前节点的属性
ancestor:父辈元素 / ancestor-or-self:父辈元素及当前元素
descendant:后代 / descendant-or-self:后代及当前节点本身
方法同上 following :选取当前节点的结束标签之后的所有节点,包括节点的子孙节点
preceding:选取当前节点的开始标签之前的所有节点,包括节点的子孙节点
following-sibling:选取当前节点之后的所有同级节点
preceding-sibling:选取当前节点之前的所有同级节点

Xpath 高级用法的更多相关文章

  1. 【爬虫】Xpath高级用法

    xpath速度比较快,是爬虫在网页定位中的较优选择,但是很多网页前端代码混乱难以定位,而学习定位也较为不易(主要是全面的教程较少),这里列出一点编程过程中可能有用的东西,欢迎共同学习批评指正.试验环境 ...

  2. XPath高级用法(冰山一角)

    运算符+内置函数 使用XPath选择元素时,使用运算符+内置函数来进行筛选: .//div[contains(@class,"ec_desc") or contains(@clas ...

  3. Selenium WebDriver高级用法

    Selenium GitHub地址 选择合适的WebDrvier WebDriver是一个接口,它有几种实现,分别是HtmlUnitDrvier.FirefoxDriver.InternetExplo ...

  4. Visual Studio 宏的高级用法

    因为自 Visual Studio 2012 开始,微软已经取消了对宏的支持,所以本篇文章所述内容只适用于 Visual Studio 2010 或更早期版本的 VS. 在上一篇中,我已经介绍了如何编 ...

  5. SolrNet高级用法(分页、Facet查询、任意分组)

    前言 如果你在系统中用到了Solr的话,那么肯定会碰到从Solr中反推数据的需求,基于数据库数据生产索引后,那么Solr索引的数据相对准确,在电商需求中经常会碰到菜单.导航分类(比如电脑.PC的话会有 ...

  6. sqlalchemy(二)高级用法

    sqlalchemy(二)高级用法 本文将介绍sqlalchemy的高级用法. 外键以及relationship 首先创建数据库,在这里一个user对应多个address,因此需要在address上增 ...

  7. Solr学习总结(六)SolrNet的高级用法(复杂查询,分页,高亮,Facet查询)

    上一篇,讲到了SolrNet的基本用法及CURD,这个算是SolrNet 的入门知识介绍吧,昨天写完之后,有朋友评论说,这些感觉都被写烂了.没错,这些基本的用法,在网上百度,资料肯定一大堆,有一些写的 ...

  8. 再谈Newtonsoft.Json高级用法

    上一篇Newtonsoft.Json高级用法发布以后收到挺多回复的,本篇将分享几点挺有用的知识点和最近项目中用到的一个新点进行说明,做为对上篇文章的补充. 阅读目录 动态改变属性序列化名称 枚举值序列 ...

  9. Jquery remove 高级用法

    Jquery remove 高级用法 html 代码 <div class="file-image">abc1111</div><div class= ...

随机推荐

  1. 【Go实战基础】创建并完成第一个可执行的 go 程序

    实战需求:创建并完成第一个可执行的 go 程序.项目目录:go-001具体实战步骤如下: 一.进入工程目录 cd go-001/ 二. 创建 g001.go 文件 /* * @Author: 菜鸟实战 ...

  2. java过滤器的写法

    ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 原文地址:http://t.csdn.cn/ZD88A ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 过滤器实际上就是 ...

  3. [RootersCTF2019]I_<3_Flask-1|SSTI注入

    1.打开之后很明显的提示flask框架,但是未提供参数,在源代码中发现了一个git地址,打开之后也是没有啥用,结果如下: 2.这里我们首先需要爆破出来参数进行信息的传递,就需要使用Arjun这一款工具 ...

  4. Stringboot中@Autowired加了static就属性值就为null

    //错误 @Autowired private static DepartmentDao departmentDao; @Autowired注入,将bean注入进来 @Autowired通过sprin ...

  5. mac_VMWare安装总结

    MacOS 安装VmWare 总结 如果之前安装过virtualBox,virtualBox的内核扩展会影响到VmWare的使用 *比如会导致VMWare虽然可以安装,却无法创建虚拟机 这是需要执行以 ...

  6. Lua 支持虚函数的解决方案

    概述 lua本身没有提供类似C++虚函数机制,调用的父类方法调用虚函数可能会出现问题. 问题分析 分析这段代码和输出 local Gun = {} -- 示例,实际应用还要考虑构造,虚表等情况 fun ...

  7. winform, 实现窗口程序像QQ一样靠近桌面边缘自动隐藏窗口

    实现原理: 步骤如下: 1.判断窗体程序是否靠近桌面边缘: 2.获取桌面屏幕大小与窗体程序大小: 3.把窗体程序显示在桌面以外隐藏起来,预留部分窗体方便用户拉出程序: 4.判断鼠标是否在窗体程序上,在 ...

  8. Kafka为什么性能这么快?4大核心原因详解

    Kafka的性能快这是大厂Java面试经常问的一个话题,下面我就重点讲解Kafka为什么性能这么快的4大核心原因@mikechen 1.页缓存技术 Kafka 是基于操作系统 的页缓存(page ca ...

  9. 使用读写分离模式扩展 Grafana Loki

    转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247500127&idx=1&sn=995987d558 ...

  10. catalina.out日志割接

    文章转载自:https://blog.51cto.com/loong576/2091460 Tomcat的catalina.out日志分割有多种方式,如logrotate.cronolog等,本文采用 ...