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爬虫开发与项目实践》