xpath节点匹配简易教程

news/2024/7/19 10:18:15 标签: 爬虫

2017-03-23

非本人原创,只是写爬虫时很有用,就留下了

<A id="a1">
   <B id="b1">
    <C id="c1">
     <B name="b"/>
     <D id="d1"/>
     <E id="e1"/>
     <E id="e2"/>
    </C>
   </B>
   <B id="b2"/>
   <C id="c2">
    <B/>
    <D id="d2"/>
    <F/>
   </C>
   <E/>
  </A>
以下将要介绍一些XPath中节点匹配的基本方法。

  路径匹配

  路径匹配与文件路径的表示相仿,比较好理解。有以下几个符号:

  (1)用“/”指示节点路径

  如“/A/C/D” 表示节点"A"的子节点"C"的子节点"D",即id值为d2的D节点, “/”表示根节点。

     (2)用“//” 表示所有路径以"//"后指定的子路径结尾的元素

  如“//E” 表示所有E元素,结果是所有三个E元素,如“//C/E”表示所有父节点为C的E元素,结果是id值为e1和e2的两个E元素 。

  (3)用“*” 表示路径的通配符

  如“/A/B/C/*”表示 A元素→B元素→C元素下的所有子元素,即name值为b的B元素、 id值为d1的D元素和id值为e1和e2的两个E元素

  “/*/*/D”表示上面有两级节点的D元素,匹配结果是id值为d2的D元素 ,如“//*”表示所有的元素。

  位置匹配

对于每一个元素,它的各个子元素是有序的。

  如:/A/B/C/B[1]表示A元素→B元素→C元素的第一个B元素,得到name值为b的B元素

  /A/B/C/E[last()]表示A元素→B元素→C元素的最后一个E元素,得到id值为e2的E元素

  /A/B/C/E[position()>1]表示A元素→B元素→C元素之下的位置号大于1的E元素,得到id值为e2的E元素 

  属性及属性值

  在XPath中可以利用属性及属性值来匹配元素,要注意的是,元素的属性名前要有"@"前缀。例如:

  //B[@id]表示所有具有属性id的B元素,结果为id值为b1和b2的两个B元素

  //B[@*]表示所有具有属性的B元素,结果为两个具有id属性的B元素和一个具有name属性B元素

  //B[not(@*)]表示所有不具有属性的B元素,结果为A元素→C元素下的B元素

  //B[@id="b1"] id值为b1的B元素,结果为A元素下的B元素

  亲属关系匹配

XML文档可归结为树型结构,因此任何一个节点都不是孤立的。通常我们把节点之间的归属关系归结为一种亲属关系,如父亲、孩子、祖先、后代、兄弟等等。在对元素进行匹配时,同样可以用到这些概念。例如:

    //E/parent::* 表示所有E节点的父节点元素,结果为id值为a1的A元素和id值为c1的C元素

  //F/ancestor::* 表示所有F元素的祖先节点元素,结果为id值为a1的A元素和id值为c2的C元素

  /A/child::* 表示A的子元素,结果为id值为b1、b2的B元素,id值为c2的C元素,以及没有任何属性的E元素

  /A/descendant::* 表示A的所有后代元素,结果为除A元素以外的所有其它元素

  //F/self::* 表示所有F的自身元素,结果为F元素本身

  //F/ancestor-or-self::* 表示所有F元素及它的祖先节点元素,结果为F元素、F元素的父节点C元素和A元素

  /A/C/descendant-or-self::* 表示所有A元素→C元素及它们的后代元素,结果为id值为c2的C元素、该元素的子元素B、D、F元素

  /A/C/following-sibling::* 表示A元素→C元素的紧邻的后序所有兄弟节点元素,结果为没有任何属性的E元素

  /A/C/preceding-sibling::* 表示A元素→C元素的紧邻的前面所有兄弟节点元素,结果为id值为b1和b2的两个B元素

  /A/B/C/following::* 表示A元素→B元素→C元素的后序的所有元素,结果为id 为b2的B元素、无属性的C元素、无属性的B元素、id为d2的D元素、无属性的F元素、无属性的E元素。

  /A/C/preceding::* 表示A元素→C元素的前面的所有元素,结果为id为b2的B元素、id为e2的E元素、id为e1的E元素、id为d1的D元素、name为 b的B元素、id为c1的C元素、id为b1的B元素

转载于:https://www.cnblogs.com/zhangtianyuan/p/6829496.html


http://www.niftyadmin.cn/n/842913.html

相关文章

python如何实现二叉树_python实现二叉树

初学python&#xff0c;需要实现一个决策树&#xff0c;首先实践一下利用python实现一个二叉树数据结构。建树的时候做了处理&#xff0c;保证建立的二叉树是平衡二叉树。# -*- coding: utf-8 -*-from collections import dequeclass Node:def __init__(self,val,leftNone,righ…

数据结构Java实现--队列

[1]队列的定义 队列是一种操作受限制的线性表&#xff0c;其限制为仅允许在表的一端进行插入操作&#xff0c;而在表的另一端进行删除操作。 把进行插入的一端称为队尾&#xff0c;把进行删除的一端称为队头或队首&#xff0c;插入元素叫进队&#xff0c;删除元素叫出队&#…

三星推T5便携SSD:比名片还小!

在便携式SSD T3之后&#xff0c;三星今天又推出了它的升级版产品T5&#xff0c;不仅体积更小&#xff0c;而且性能更强。 T5系列的采用了三星48层V-NAND技术&#xff0c;最高持续读写速度可达450MB/s&#xff0c;容量最高可达2TB&#xff0c;通过USB接口和电脑连接&#xff0c;…

python正弦函数需导入模块_Python开发【第十五篇】模块的导入

的导入语句import 语句语法&#xff1a;import 模块名1 [as 模块别名]作用&#xff1a;将某模块整体导入到当前模块示例&#xff1a;import mathimport sys,os用法&#xff1a;模块名.属性名math.factorial(5)print(math.pi)dir(obj) 函数,返回模块的所有属性的字符串列表help(…

手撸MyBatis从配置文件到读出数据库的模拟实现

手动模拟MyBatis入门案例的底层实现&#xff1a; 需要了解的关键技术&#xff1a; java反射、动态代理(comming soon&#xff09; 一、Mybatis入门案例 点击此处跳过入门案例 首先看一下MyBatis最基础的入门案例 目标&#xff1a;读取数据库名为mybatis中的user表内容 maven…

帝艾帝再次受邀参加智能安防新技术新产品研讨会南宁站

继9月28日&#xff0c;帝艾帝参加由华强安防网主办的中国智能安防产业新技术、新产品全国巡回研讨会西安站活动&#xff0c;本次11月25日的巡回研讨会南宁站&#xff0c;帝艾帝再次受邀参加此次盛会。 本次会议旨在为工程商和厂商搭建面对面交流平台&#xff0c;现场沟通讲解&a…

ServletConfig对象

A servlet configuration object used by a servlet container to pass information to a servlet during initialization. servlet 容器使用的 servlet 配置对象&#xff0c;该对象在初始化期间将信息传递给 servlet。 ServletConfig接口提供的方法: Method Summary Stringget…

dna配置数据源mysql_[数据库推荐]gene:基因相关信息查询

我们在进行基因相关研究的时候&#xff0c;如果要研究一个基因&#xff0c;那么首先要知道这个基因的一些基本信息&#xff0c;检索基因相关的网站还是很多的。其中比较出名的还是genecards。一个汇总的了很多数据库的的综合性基因查询网站。但是&#xff0c;这个网站只能检索和…