Python爬虫--Xpath

Xpath

Xpath是一门在XML文档中查找信息的语言,被用于在XML文档中通过元素和属性进行导航,也可以用在HTML文档中工作。Python爬虫开发中,经常使用Xpath查找提取网页中的信息,因此Xpath非常重要。

1、Xpath节点

在Xpath中,XML文档被作为节点树来对待的,有7种类型节点:

  1. 元素
  2. 属性
  3. 文本
  4. 命名空间
  5. 处理指令
  6. 注释
  7. 文档(根)节点

来看一个例子:

<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>

<classroom>是文档节点
<id>1001</id>是元素节点
lang="en"是属性节点
marry是文本节点
节点关系包括父(parent)、子(children)、同胞(sibling)、 先辈(ancestor)、后代(descendent)。

2、Xpath语法

路径表达式

Xpath使用路径表达式来选取XML文档中的节点或节点集。节点是沿着路径path或步steps来选取的。
常用的路径表达式:

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

看一个例子:

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

通过谓词来选取某个特定的节点或者包含某个指定值的节点。
使用中括号[]来表示谓词:

实现效果 路径表达式
选取属于classroom子元素的第一个student元素 /classroom/student[1]
选取属于classroom子元素的最后一个student元素 /classroom/student[last()]
选取属于classroom子元素的倒数第二个student元素 /classroom/student[last()-1]
选取classroom子元素的最前面的两个studaent元素 /classroom/student[position()<3]
选取所有拥有lang属性的name元素 //name[@lang]
选取所有拥有lang属性并且值为“en”的name元素 //name[@lang='en']
选取classroom元素的所有studnet元素,并且其age元素的值大于20 /classroom/student[age>20]
选取classroom元素中的student元素的所有name元素,并且其age元素的值大于20 /classroom/student[age>20]/name
通配符
  • 使用通配符“*”匹配未知的元素
  • 使用通配符“|”一次选取多条路径
实现效果 路径表达式
选取classroom元素的所有子元素 /classroom/*
选取文档中的所有元素 //*
选取所有带有属性的name元素 //name[@*]
选取student元素的所有name元素和age元素 //student/name | //student/age
选取属于classroom元素的student元素的所有name元素,以及文档中所有age元素 /classroom/student/name | //age

猜你喜欢

转载自www.cnblogs.com/lykxbg/p/12002936.html