《Python爬虫开发与项目实践》读书笔记——XPath

XPath

  • XPath 是一门在XML文档中查找信息的语言,被用于在XML文档中通过元素和属性进行导航。不够它也可以在HTML文档中工作,并且大部分浏览器也支持通过XPath来查询节点。

  • 在python爬虫开发中,经常使用XPath查找提取网页中的信息,因此XPath非常重要。

1.XPath节点

  • 在XPath中,XML文档是被作为节点树来对待的,有七种类型的节点:元素、属性、文件、命名空间、处理指令、注释以及文档节点。

  • 树的根被称为文档节点或者根节点。

  • E.g.:

<?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>
</classroom>
  • 上面的XML文档中的节点例子包括:<classroom>(文档节点)、 <id>1001</id>(元素节点)、lang="en"(属性节点)、marry(文本)。

2. XPath语法

  • XPath使用路径表达式来选取XML文档中的节点或节点集。节点是沿着path或者step来选取的。

  • 路径表达式

    表达式 描述
    nodename 选取此节点的所有子节点
    / 从根结点选取
    // 选择任意位置的某个节点
    . 选择当前节点
    .. 选择当前节点的父节点
    @ 选取属性
  • 选取某个特定的节点或者包含某一个指定的值的节点,有时需要用到谓语。

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

    XPath在进行节点选取的时候可以使用通配符"*"匹配未知的元素,同时使用操作符"|"一次选取多条路径。

    实现效果 路径表达式
    选取所有带有属性的name元素 //name[@*]
    选取student元素的所有name和age元素 //student/name | //student/age

3. XPath轴

  • 轴定义了所选节点与当前节点之间的树关系。

  • 位置路径均包括一个或多个步,每个步均被斜杠分割:/step/step...(绝对位置路径),step/step/...(相对位置路径)

  • 步(step)包括:轴(axis)、节点测试(node-test)、零个或者更多谓语(predicate),用来更深入地提炼所选的节点集。

  • 轴名称 含义
    child 选取当前节点的所有子元素
    parent 选取当前节点的父节点
    ancestor 选取当前结点的所有先辈
    ancestor-or-self 选取当前节点的所有先辈及当前节点本身
    descendant 选取当前结点的所有后代元素
    descentdant-or-self 选取当前结点的所有后代元素及当前节点本身
    preceding 选取当前节点的开始标记之前的所有节点
    following 选取当前节点的结束标记之后的所有节点
    preceding-sibling 选取当前节点之前的所有同级节点
    following-sibling 选取当前节点之后的所有同级节点
    self 选取当前节点
    attribute 选取当前结点的所有属性
    namespace 选取当前节点的所有命名空间节点

    XPath轴:

    轴名称 含义
    child 选取当前节点的所有子元素
    parent 选取当前节点的父节点
    ancestor 选取当前结点的所有先辈
    ancestor-or-self 选取当前节点的所有先辈及当前节点本身
    descendant 选取当前结点的所有后代元素
    descentdant-or-self 选取当前结点的所有后代元素及当前节点本身
    preceding 选取当前节点的开始标记之前的所有节点
    following 选取当前节点的结束标记之后的所有节点
    preceding-sibling 选取当前节点之前的所有同级节点
    following-sibling 选取当前节点之后的所有同级节点
    self 选取当前节点
    attribute 选取当前结点的所有属性
    namespace 选取当前节点的所有命名空间节点
  • E.g. 选取所有id节点的父节点:

//id/parent::*


  • 参考:《Python爬虫开发与项目实践》

推荐阅读更多精彩内容