zoukankan      html  css  js  c++  java
  • Xpath语法学习

    XPath是一门在XML文档中查找信息的语言,被用于在XML文档中通过元素和属性进行导航。XPath虽然是被设计用来搜寻XML文档,不过它也能很好地在HTML文档中工作,并且大部分浏览器也支持通过XPath来查询节点。在Python爬虫开发中,经常使用XPath查找提取网页中的信息,因此XPath非常重要,支持Xpath语法的模板有lxml、scrapy。

    文档示例:

    <? xml version="1.0" encoding="ISO-8859-1"? >
    <classroom>
         <student>
             <id>1001</id>
             <name lang="en">marry</name>
             <age>20</age>
             <country>China</country>
         </student>
         <student>
             <id>1002</id>
             <name lang="en">jack</name>
             <age>25</age>
             <country>USA</country>
         </student>
    </classroom>
    

    1、路径表达式

    表达式 用途
    nodename 选取此节点的所有子节点
    / 从根节点选取
    // 选择任意位置的某个节点
    . 选取当前节点
    .. 选取当前节点的父节点
    @ 选取属性

    2、节点选取示例

    实现效果 路径表达式
    选取classroom元素的所有子节点 classroom
    选取根元素classroom /classroom
    选取属于classroom的子元素的所有student元素 classroom/student
    选取所有student子元素,而不管它们在文档中的位置 //student
    选择属于classroom元素的后代的所有student元素,而不管它们位于classroom之下的什么位置 classroom//student
    选取名为lang的所有属性 //@lang

    3、谓语示例

    实现效果 路径表达式
    选取属于classroom子元素的第一个student元素 /classroom/student[1]
    选取属于classroom子元素的最后一个student元素 /classroom/student[last()]
    选取属于classroom子元素的倒数第二个student元素 /classroom/student[last()-1]
    选取最前面的两个属于classroom元素的子元素的student元素 /classroom/student[position()<3]
    选取所有拥有名为lang的属性的name元素 //name[@lang]
    选取所有name元素,且这些元素拥有值为en的lang属性 //name[@lang='en']
    选取classroom元素的所有student元素,且其中的age元素的值须大于20 /classroom/student[age>20]
    选取classroom元素中的student元素的所有name元素,且其中的age元素的值须大于20 /classroom/student[age>20]/name

    4、通配符* 与 | 操作符

    实现效果 路径表达式
    选取classroom元素的所有子元素 /classroom/*
    选取文档中的所有元素 //*
    选取所有带属性的name元素 //name[@*]
    选取student元素的所有name和age元素 //student/name | //student/age
    选取属于classroom元素的student元素的所有name元素,以及文档中所有的age元素 /classroom/student/name | //age

    5、Xpath轴

    轴名称 含义
    child 选取当前节点的所有元素
    parent 选取当前节点的父节点
    ancestor 选取当前节点的所有先辈(父、祖父等)
    ansestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身
    descendant 选取当前节点的所有后代元素(子、孙等)
    descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身
    preceding 选取文档中当前节点的开始标记之前的所有节点
    following 选取文档中当前节点的结束标记之后的所有节点
    preceding-sibling 选取当前节点之前的所有同级节点
    following-sibling 选取当前节点之后的所有同级节点
    self 选取当前节点
    attribute 选取当前节点的所有属性
    namespace 选取当前节点的所有命令空间节点

    文档示例: 

    <? xml version="1.0" encoding="ISO-8859-1"? > 
    <classroom> 
        <student> 
            <id>1001</id> 
            <name lang="en">marry</name> 
            <age>20</age> 
            <country>China</country> 
        </student> 
        <student> 
            <id>1002</id> 
            <name lang="en">jack</name> 
            <age>25</age> 
            <country>USA</country> 
        </student> 
        <teacher> 
            <classid>1</classid> 
            <name lang="en">tom</name> 
            <age>50</age> 
            <country>USA</country> 
        </teacher> 
    </classroom>
    

    6、Xpath轴示例分析

    实现效果 路径表达式
    选取当前classroom节点中子元素的teacher节点 /classroom/child::teacher
    选取所有id节点的父节点 //id/parent::*
    选取所有以classid为子节点的祖先节点 //classid/ancestor::*
    选取classroom节点下所有后代节点 /classroom/descendant::*
    选取所有以student为父节点的id元素 //student/descendant::id
    选取所有classid元素的祖先节点及本身 //classid/ancestor-or-self::*
    选择/classroom/student本身及所有后代元素 /classroom/student/descendant-or-self::*
    选取/classroom/teacher之前的所有同级节点,结果就是选择了所有student节点 /classroom/teacher/preceding-sibling::*
    选取/classroom中第二个student之后的同级节点,结果就是选择了teacher节点 /classroom/student[2]/following-sibling::*
    选取/classroom/teacher/节点所有之前的节点(除其祖先外),不仅仅是student节点,还有里面的子节点 /classroom/teacher/preceding::*
    选取classroom中第二个student之后的所有节点,结果就是选择了teacher节点及其子节点 /classroom/student[2]/following::*
    选取student节点,单独使用没有什么意思。主要是跟其它轴一起用,如ancestor-of-self,descendant-or-self //student/self::*
    选取/classroom/teacher/name节点下的所有属性 /classroom/teacher/name/attribute::*

    7、运算符

    运算符 描述 实例 含义
    | 计算两个节点集 //student/name | //student/age 选取student元素的所有name和age元素
    + 加法 /classroom/student[age=19+1] 选取classroom元素的所有student元素,且其中的age元素的值须等于20
    - 减法 /classroom/student[age=21-1] 同上
    * 乘法 /classroom/student[age=4*5] 同上
    div 除法 /classroom/student[age=40 div 2] 同上
    = 等于 /classroom/student[age=20] 同上
    != 不等于 /classroom/student[age!=20] 选取student元素的所有name和age元素,且其中的age元素的值不等于20
    < 小于 /classroom/student[age<20] 选取student元素的所有name和age元素,且其中的age元素的值小于20
    <= 小于等于 /classroom/student[age<=20] 选取student元素的所有name和age元素,且其中的age元素的值小于等于20
    > 大于 /classroom/student[age>20] 选取student元素的所有name和age元素,且其中的age元素的值大于20
    >= 大于等于 /classroom/student[age>=20] 选取student元素的所有name和age元素,且其中的age元素的值大于等于20
    or /classroom/student[age<20 or age>25] 选取student元素的所有name和age元素,且其中的age元素的值须小于20,或者大于25
    and /classroom/student[age>20 and age<25] 选取student元素的所有name和age元素,且其中的age元素的值须大于20,或者小于25
    mod 计算除法的余数 5 mod 2 1
  • 相关阅读:
    ccache: error: Failed to ctreate temporary file for esp-idf/..../pwhash_scryptsalsa208sha256_nosse.c.obj: No Such file or directory
    electron+vue-cli3 打包报错 “Application entry file "background.js" does not exist”
    给按钮加loading效果
    java 的 try catch
    mac 的jmeter启动命令
    json转java对象 和 java对象转json 的方法 (一个类renturn的数据 映射到另外一个类接收)
    springboot 待学习的东西
    csv
    vue-cli 出现导航重复解决方法
    vue json展示组件
  • 原文地址:https://www.cnblogs.com/Eivll0m/p/8601694.html
Copyright © 2011-2022 走看看